Merge pull request 'dev' (#15) from dev into master

Reviewed-on: http://git.excellentkk.cn/mkm/shop-php/pulls/15
This commit is contained in:
mkm 2023-08-25 11:01:04 +08:00
commit 322d43eea2
834 changed files with 179088 additions and 130716 deletions

1
.gitignore vendored
View File

@ -12,3 +12,4 @@ public/protocol.html
/runtime/* /runtime/*
runtime/swoole.pid runtime/swoole.pid
cert_crmeb copy.key cert_crmeb copy.key
dump.rdb

View File

@ -12,6 +12,7 @@
namespace app; namespace app;
use crmeb\utils\DingTalk;
use think\db\exception\DataNotFoundException; use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException; use think\db\exception\ModelNotFoundException;
use think\db\exception\PDOException; use think\db\exception\PDOException;
@ -65,6 +66,9 @@ class ExceptionHandle extends Handle
{ {
// 添加自定义异常处理机制 // 添加自定义异常处理机制
$this->report($e); $this->report($e);
if ($e->getCode() != 0) {
DingTalk::exception($e, $e->getMessage(), $request);
}
// 其他错误交给系统处理 // 其他错误交给系统处理
if ($e instanceof ValidateException) if ($e instanceof ValidateException)
return app('json')->fail($e->getMessage()); return app('json')->fail($e->getMessage());

View File

@ -17,6 +17,7 @@ use app\common\dao\BaseDao;
use app\common\model\community\Community; use app\common\model\community\Community;
use app\common\model\system\Relevance; use app\common\model\system\Relevance;
use app\common\repositories\system\RelevanceRepository; use app\common\repositories\system\RelevanceRepository;
use think\facade\Db;
class CommunityDao extends BaseDao class CommunityDao extends BaseDao
{ {
@ -30,7 +31,8 @@ class CommunityDao extends BaseDao
{ {
$query = Community::hasWhere('author', function($query) use ($where){ $query = Community::hasWhere('author', function($query) use ($where){
$query->when(isset($where['username']) && $where['username'] !== '', function ($query) use($where) { $query->when(isset($where['username']) && $where['username'] !== '', function ($query) use($where) {
$query->whereLike('real_name|phone|nickname',"%{$where['username']}%"); $uid = Db::name('merchant')->where('mer_name', $where['username'])->value('uid', -1);
$query->where('uid', $uid);
}); });
$query->where(true); $query->where(true);
}); });
@ -38,6 +40,9 @@ class CommunityDao extends BaseDao
->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use($where) { ->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use($where) {
$query->whereLike('Community.title',"%{$where['keyword']}%"); $query->whereLike('Community.title',"%{$where['keyword']}%");
}) })
->when(!empty($where['resale_type']), function ($query) use($where) {
$query->where('Community.resale_type', $where['resale_type']);
})
->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use($where) { ->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use($where) {
$query->where('Community.uid',$where['uid']); $query->where('Community.uid',$where['uid']);
}) })

View File

@ -16,6 +16,12 @@ namespace app\common\dao\store;
use app\common\dao\BaseDao; use app\common\dao\BaseDao;
use app\common\model\BaseModel; use app\common\model\BaseModel;
use app\common\model\store\CityArea; use app\common\model\store\CityArea;
use app\common\model\store\GeoProvince;
use app\common\model\store\GeoCity;
use app\common\model\store\GeoArea;
use app\common\model\store\GeoStreet;
use app\common\model\store\GeoVillage;
use app\common\model\store\GeoBrigade;
class CityAreaDao extends BaseDao class CityAreaDao extends BaseDao
{ {
@ -53,10 +59,35 @@ class CityAreaDao extends BaseDao
} }
} }
} }
$query->whereLike('path', $path . '%')->where('name', $street); $query->getVillage('path', $path . '%')->where('name', $street);
}); });
} }
public function searchGeo(array $where)
{
if (!empty($where['street_code'])) {
return GeoVillage::getDB()->where('street_code', $where['street_code']);
}
if (!empty($where['area_code'])) {
return GeoStreet::getDB()->where('area_code', $where['area_code']);
}
if (!empty($where['city_code'])) {
return GeoArea::getDB()->where('city_code', $where['city_code']);
}
if (!empty($where['province_code'])) {
return GeoCity::getDB()->where('province_code', $where['province_code']);
} else {
return GeoProvince::getDB();
}
return false;
}
public function searchBrigade(array $where)
{
return GeoBrigade::getDB();
}
public function getCityList(CityArea $city) public function getCityList(CityArea $city)
{ {
if (!$city->parent_id) return [$city]; if (!$city->parent_id) return [$city];

View File

@ -29,6 +29,7 @@ class StoreCartDao extends BaseDao
const SOURCE_STORE_CLOUD = 101; //店铺内云商品 const SOURCE_STORE_CLOUD = 101; //店铺内云商品
const SOURCE_CLOUD = 102; //云仓内店铺商品 const SOURCE_CLOUD = 102; //云仓内店铺商品
const SOURCE_COMMUNITY_RESALE = 201; //转售商品
protected function getModel(): string protected function getModel(): string
{ {
@ -114,7 +115,7 @@ class StoreCartDao extends BaseDao
->append(['bc_extension_one', 'bc_extension_two']); ->append(['bc_extension_one', 'bc_extension_two']);
}, },
'merchant' => function (Relation $query) use ($uid) { 'merchant' => function (Relation $query) use ($uid) {
$query->field('mer_id,mer_name,mer_state,mer_avatar,delivery_way,commission_rate,category_id')->with(['coupon' => function ($query) use ($uid) { $query->field('mer_id,mer_name,mer_state,mer_avatar,delivery_way,commission_rate,category_id,credit_buy,settle_cycle,interest_rate')->with(['coupon' => function ($query) use ($uid) {
$query->where('uid', $uid); $query->where('uid', $uid);
}, },
'config' => function ($query) { 'config' => function ($query) {

View File

@ -16,6 +16,7 @@ namespace app\common\dao\store\order;
use app\common\dao\BaseDao; use app\common\dao\BaseDao;
use app\common\model\store\order\StoreGroupOrder; use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder;
/** /**
* Class StoreGroupOrderDao * Class StoreGroupOrderDao
@ -42,11 +43,12 @@ class StoreGroupOrderDao extends BaseDao
* @author xaboy * @author xaboy
* @day 2020/6/11 * @day 2020/6/11
*/ */
public function orderNumber($uid = null) public function orderNumber($uid = null, $productType = 0)
{ {
return StoreGroupOrder::when($uid, function ($query, $uid) { $storeOrderWhere = StoreOrder::where('activity_type', $productType);
$query->where('uid', $uid); return StoreGroupOrder::hasWhere('orderList', $storeOrderWhere)->when($uid, function ($query, $uid) {
})->where('is_del', 0)->where('paid', 0)->count(); $query->where('StoreGroupOrder.uid', $uid);
})->where('StoreGroupOrder.is_del', 0)->whereRaw("(StoreGroupOrder.paid=0 and status!=12) or (StoreGroupOrder.paid=1 and StoreGroupOrder.pay_type=8 and StoreOrder.status=2)")->count();
} }
/** /**
@ -57,14 +59,18 @@ class StoreGroupOrderDao extends BaseDao
*/ */
public function search(array $where) public function search(array $where)
{ {
return StoreGroupOrder::getDB()->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) { return StoreGroupOrder::getDB()->alias('StoreGroupOrder')->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) {
$query->where('paid', $where['paid']); if ($where['paid'] == 0) {
$query->whereRaw("StoreGroupOrder.paid=0 or (StoreGroupOrder.paid=1 and StoreGroupOrder.pay_type=8)");
} else {
$query->where('StoreGroupOrder.paid', $where['paid']);
}
})->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) { })->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
$query->where('uid', $where['uid']); $query->where('StoreGroupOrder.uid', $where['uid']);
})->order('create_time DESC')->when(isset($where['is_del']) && $where['is_del'] !== '', function ($query) use ($where) { })->order('create_time DESC')->when(isset($where['is_del']) && $where['is_del'] !== '', function ($query) use ($where) {
$query->where('is_del', $where['is_del']); $query->where('StoreGroupOrder.is_del', $where['is_del']);
}, function ($query) { }, function ($query) {
$query->where('is_del', 0); $query->where('StoreGroupOrder.is_del', 0);
}); });
} }

View File

@ -15,6 +15,7 @@ namespace app\common\dao\store\order;
use app\common\dao\BaseDao; use app\common\dao\BaseDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder; use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderProduct; use app\common\model\store\order\StoreOrderProduct;
use app\common\model\store\order\StoreOrderStatus; use app\common\model\store\order\StoreOrderStatus;
@ -91,16 +92,26 @@ class StoreOrderDao extends BaseDao
->when(isset($where['activity_type']) && $where['activity_type'] != '', function ($query) use ($where) { ->when(isset($where['activity_type']) && $where['activity_type'] != '', function ($query) use ($where) {
$query->where('activity_type', $where['activity_type']); $query->where('activity_type', $where['activity_type']);
}) })
->when(isset($where['product_type']) && $where['product_type'] != '', function ($query) use ($where) {
$query->where('activity_type', $where['product_type']);
})
->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) { ->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) {
// 12表示信用购 先货后款
switch ($where['status']) { switch ($where['status']) {
case 0 : case 0 :
$query->whereIn('StoreOrder.status', [0, 9]); $query->whereIn('StoreOrder.status', [0, 9, 12]);
break; break;
case -2 : case -2 :
$query->where('paid', 1)->whereNotIn('StoreOrder.status', [10, 11]); $query->where('StoreOrder.paid', 1)->whereNotIn('StoreOrder.status', [10, 11]);
break; break;
case 10 : case 10 :
$query->where('paid', 1)->whereIn('StoreOrder.status', [10, 11]); $query->where('StoreOrder.paid', 1)->whereIn('StoreOrder.status', [10, 11]);
break;
case 2 :
$query->where('StoreOrder.paid', 1)->where('StoreOrder.status', $where['status'])->where('pay_type', '<>', StoreGroupOrder::PAY_TYPE_CREDIT_BUY);
break;
case 20 :
$query->where('StoreOrder.paid', 1)->whereIn('StoreOrder.status', [2, 3]);
break; break;
default: default:
$query->where('StoreOrder.status', $where['status']); $query->where('StoreOrder.status', $where['status']);
@ -110,7 +121,7 @@ class StoreOrderDao extends BaseDao
->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) { ->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
$query->where('StoreOrder.uid', $where['uid']); $query->where('StoreOrder.uid', $where['uid']);
}) })
->when(isset($where['is_user']) && $where['is_user'] !== '', function ($query) use ($where) { ->when(isset($where['is_user']) && $where['is_user'] !== 0, function ($query) use ($where) {
$query->where(function($query) { $query->where(function($query) {
$query->where('order_type',0)->whereOr(function($query){ $query->where('order_type',0)->whereOr(function($query){
$query->where('order_type',1)->where('main_id',0); $query->where('order_type',1)->where('main_id',0);
@ -503,7 +514,7 @@ class StoreOrderDao extends BaseDao
{ {
return StoreOrderStatus::getDB()->alias('A')->leftJoin('StoreOrder B', 'A.order_id = B.order_id') return StoreOrderStatus::getDB()->alias('A')->leftJoin('StoreOrder B', 'A.order_id = B.order_id')
->where('A.change_type', 'take') ->where('A.change_type', 'take')
->where('A.change_time', '<', $end)->where('B.paid', 1)->where('B.status', 2) ->where('A.change_time', '<', $end)->where('B.paid', 1)->where('B.status', 2)->where('B.pay_type', '<>', StoreGroupOrder::PAY_TYPE_CREDIT_BUY)
->column('A.order_id'); ->column('A.order_id');
} }

View File

@ -50,6 +50,9 @@ class StoreRefundOrderDao extends BaseDao
})->when(isset($where['order_sn']) && $where['order_sn'] !== '', function ($query) use ($where) { })->when(isset($where['order_sn']) && $where['order_sn'] !== '', function ($query) use ($where) {
$ids = StoreOrder::where('order_sn','like','%'.$where['order_sn'].'%')->column('order_id'); $ids = StoreOrder::where('order_sn','like','%'.$where['order_sn'].'%')->column('order_id');
$query->where('order_id','in',$ids); $query->where('order_id','in',$ids);
})->when(isset($where['product_type']) && $where['product_type'] !== '', function ($query) use ($where) {
$ids = StoreOrder::where('uid', $where['uid'])->where('activity_type', $where['product_type'])->column('order_id');
$query->where('order_id','in',$ids);
})->when(isset($where['refund_order_sn']) && $where['refund_order_sn'] !== '', function ($query) use ($where) { })->when(isset($where['refund_order_sn']) && $where['refund_order_sn'] !== '', function ($query) use ($where) {
$query->where('refund_order_sn', 'like', '%' . $where['refund_order_sn'] . '%'); $query->where('refund_order_sn', 'like', '%' . $where['refund_order_sn'] . '%');
})->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) { })->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) {

View File

@ -155,6 +155,18 @@ class ProductAttrValueDao extends BaseDao
]); ]);
} }
public function incSales(int $productId, string $unique, int $number)
{
return model::getDB()->where('product_id', $productId)->where('unique', $unique)->update([
'sales' => Db::raw('sales+' . $number)
]);
}
public function descSales(int $productId, string $unique, int $number)
{
model::getDB()->where('product_id', $productId)->where('unique', $unique)->where('sales', '>=', $number)->dec('sales', $number)->update();
}
/** /**
* @param int $productId * @param int $productId
* @param string $sku * @param string $sku

View File

@ -151,6 +151,9 @@ class ProductDao extends BaseDao
}); });
} }
}) })
->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use ($where) {
$query->whereLike('Product.keyword', "%{$where['keyword']}%");
})
->when(isset($where['mer_labels']) && $where['mer_labels'] !== '', function ($query) use ($where) { ->when(isset($where['mer_labels']) && $where['mer_labels'] !== '', function ($query) use ($where) {
$query->whereLike('U.mer_labels', "%,{$where['mer_labels']},%"); $query->whereLike('U.mer_labels', "%,{$where['mer_labels']},%");
}) })
@ -318,6 +321,18 @@ class ProductDao extends BaseDao
]); ]);
} }
public function incSales(int $productId, int $number)
{
return model::getDB()->where('product_id', $productId)->update([
'sales' => Db::raw('sales+' . $number)
]);
}
public function descSales(int $productId, int $number)
{
model::getDB()->where('product_id', $productId)->where('sales', '>=', $number)->dec('sales', $number)->update();
}
/** /**
* @param int $productId * @param int $productId
* @param int $inc * @param int $inc

View File

@ -112,9 +112,8 @@ class FinancialRecordDao extends BaseDao
} else { } else {
$query->whereMonth('create_time',$date); $query->whereMonth('create_time',$date);
} }
$count = $query->group('order_id')->where('number', '<>', 0)->count();
$count = $query->group('order_id')->count(); $number = $query->where('number', '<>', 0)->sum('number');
$number = $query->sum('number');
return [$count,$number]; return [$count,$number];
} }

View File

@ -49,6 +49,9 @@ class MerchantDao extends BaseDao
->when($is_del !== null, function ($query) use ($is_del) { ->when($is_del !== null, function ($query) use ($is_del) {
$query->where('is_del', $is_del); $query->where('is_del', $is_del);
}) })
->when(isset($where['credit_buy']) && $where['credit_buy'] !== '', function ($query) use ($where) {
$query->where('credit_buy', $where['credit_buy']);
})
->when(isset($where['is_trader']) && $where['is_trader'] !== '', function ($query) use ($where) { ->when(isset($where['is_trader']) && $where['is_trader'] !== '', function ($query) use ($where) {
$query->where('is_trader', $where['is_trader']); $query->where('is_trader', $where['is_trader']);
}) })

View File

@ -34,7 +34,7 @@ class SystemNoticeConfigDao extends BaseDao
public function getNoticeStatusByConstKey(string $key) public function getNoticeStatusByConstKey(string $key)
{ {
$value = $this->getModel()::getDb()->where('const_key',$key)->field('notice_sys,notice_wechat,notice_routine,notice_sms')->find(); $value = $this->getModel()::getDb()->where('const_key',$key)->field('notice_sys,notice_wechat,notice_routine,notice_sms,notice_app')->find();
return $value; return $value;
} }

View File

@ -15,6 +15,7 @@ namespace app\common\dao\user;
use app\common\dao\BaseDao; use app\common\dao\BaseDao;
use app\common\model\store\GeoVillage;
use app\common\model\user\UserAddress as model; use app\common\model\user\UserAddress as model;
class UserAddressDao extends BaseDao class UserAddressDao extends BaseDao
@ -30,6 +31,10 @@ class UserAddressDao extends BaseDao
return model::class; return model::class;
} }
public function villageExists($field, $value): bool
{
return ((GeoVillage::getDB())->where($field,$value)->count()) > 0;
}
public function userFieldExists($field, $value,$uid): bool public function userFieldExists($field, $value,$uid): bool
{ {
@ -45,4 +50,5 @@ class UserAddressDao extends BaseDao
{ {
return (($this->getModel()::getDB())->where('uid',$uid)); return (($this->getModel()::getDB())->where('uid',$uid));
} }
} }

View File

@ -15,6 +15,7 @@ namespace app\common\model\community;
use app\common\model\BaseModel; use app\common\model\BaseModel;
use app\common\model\store\product\Spu; use app\common\model\store\product\Spu;
use app\common\model\store\Resale;
use app\common\model\system\Relevance; use app\common\model\system\Relevance;
use app\common\model\user\User; use app\common\model\user\User;
use app\common\repositories\system\RelevanceRepository; use app\common\repositories\system\RelevanceRepository;
@ -171,4 +172,9 @@ class Community extends BaseModel
$query->where('community_id', '<>',$value); $query->where('community_id', '<>',$value);
} }
public function resale()
{
return $this->hasMany(Resale::class, 'community_id','community_id');
}
} }

View File

@ -0,0 +1,26 @@
<?php
namespace app\common\model\store;
use app\common\model\BaseModel;
use app\common\model\store\product\Spu;
class Entrust extends BaseModel
{
public static function tablePk(): string
{
return 'id';
}
public static function tableName(): string
{
return 'entrust';
}
public function spu()
{
return $this->hasOne(Spu::class, 'product_id','product_id');
}
}

View File

@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store;
use app\common\model\BaseModel;
class GeoBrigade extends BaseModel
{
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'geo_brigade';
}
}

View File

@ -0,0 +1,31 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store;
use app\common\model\BaseModel;
class GeoCity extends BaseModel
{
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'geo_city';
}
}

View File

@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store;
use app\common\model\BaseModel;
class GeoProvince extends BaseModel
{
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'geo_province';
}
}

View File

@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store;
use app\common\model\BaseModel;
class GeoStreet extends BaseModel
{
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'geo_street';
}
}

View File

@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store;
use app\common\model\BaseModel;
class GeoVillage extends BaseModel
{
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'geo_village';
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace app\common\model\store;
use app\common\model\BaseModel;
use app\common\model\store\product\Spu;
class Resale extends BaseModel
{
public static function tablePk(): string
{
return 'id';
}
public static function tableName(): string
{
return 'resale';
}
public function spu()
{
return $this->hasOne(Spu::class, 'product_id','product_id');
}
}

View File

@ -66,7 +66,7 @@ class PresellOrder extends BaseModel
return $status; return $status;
} }
public function getCombinePayParams() public function getCombinePayParams($attach = 'presell')
{ {
return [ return [
'order_sn' => $this->presell_order_sn, 'order_sn' => $this->presell_order_sn,
@ -77,17 +77,17 @@ class PresellOrder extends BaseModel
'sub_mchid' => $this->merchant->sub_mchid, 'sub_mchid' => $this->merchant->sub_mchid,
] ]
], ],
'attach' => 'presell', 'attach' => $attach,
'body' => '尾款支付', 'body' => '尾款支付',
]; ];
} }
public function getPayParams($return_url = '') public function getPayParams($return_url = '', $attach = 'presell')
{ {
$params = [ $params = [
'order_sn' => $this->presell_order_sn, 'order_sn' => $this->presell_order_sn,
'pay_price' => $this->pay_price, 'pay_price' => $this->pay_price,
'attach' => 'presell', 'attach' => $attach,
'body' => '尾款支付' 'body' => '尾款支付'
]; ];
if ($return_url) { if ($return_url) {

View File

@ -155,6 +155,9 @@ class StoreCart extends BaseModel
'activity_id' => $this->source_id, 'activity_id' => $this->source_id,
'product_type' => $this->product_type, 'product_type' => $this->product_type,
]; ];
if ($this->product_type == 98) {
$where['product_id'] = $this->product_id;
}
} else { } else {
$where = [ $where = [
'product_id' => $this->product_id, 'product_id' => $this->product_id,

View File

@ -21,6 +21,12 @@ use app\common\repositories\store\coupon\StoreCouponRepository;
class StoreGroupOrder extends BaseModel class StoreGroupOrder extends BaseModel
{ {
const PAY_TYPE_BALANCE = 0; //余额支付
const PAY_TYPE_WECHAT = 1; //微信支付
const PAY_TYPE_ROUTINE = 2; //小程序支付
const PAY_TYPE_H5 = 3; //H5支付
const PAY_TYPE_CREDIT_BUY = 8; //信用购 先货后款
public static function tablePk(): ?string public static function tablePk(): ?string
{ {
return 'group_order_id'; return 'group_order_id';
@ -70,12 +76,12 @@ class StoreGroupOrder extends BaseModel
return $value ? implode(',', $value) : ''; return $value ? implode(',', $value) : '';
} }
public function getCombinePayParams() public function getCombinePayParams($attach = 'order')
{ {
$params = [ $params = [
'order_sn' => $this->group_order_sn, 'order_sn' => $this->group_order_sn,
'sub_orders' => [], 'sub_orders' => [],
'attach' => 'order', 'attach' => $attach,
'body' => '订单支付', 'body' => '订单支付',
]; ];
foreach ($this->orderList as $order) { foreach ($this->orderList as $order) {
@ -91,12 +97,12 @@ class StoreGroupOrder extends BaseModel
return $params; return $params;
} }
public function getPayParams($return_url = '') public function getPayParams($return_url = '', $attach = 'order')
{ {
$params = [ $params = [
'order_sn' => $this->group_order_sn, 'order_sn' => $this->group_order_sn,
'pay_price' => $this->pay_price, 'pay_price' => $this->pay_price,
'attach' => 'order', 'attach' => $attach,
'body' => '订单支付' 'body' => '订单支付'
]; ];
if ($return_url) { if ($return_url) {
@ -104,4 +110,10 @@ class StoreGroupOrder extends BaseModel
} }
return $params; return $params;
} }
public function interest()
{
return $this->hasOne(StoreOrderInterest::class, 'group_order_id', 'group_order_id');
}
} }

View File

@ -26,6 +26,11 @@ use app\common\repositories\store\MerchantTakeRepository;
class StoreOrder extends BaseModel class StoreOrder extends BaseModel
{ {
const STATUS_WAIT_CONFIRM = 12; //待确认
const STATUS_WAIT_PAY = 0; //待支付
const STATUS_WAIT_COMMENT = 2; //待评价
const STATUS_FINISH = 3; //已完成
public static function tablePk(): ?string public static function tablePk(): ?string
{ {
return 'order_id'; return 'order_id';
@ -177,4 +182,15 @@ class StoreOrder extends BaseModel
{ {
return StoreRefundOrder::where('order_id',$this->order_id)->where('status',3)->sum('refund_price'); return StoreRefundOrder::where('order_id',$this->order_id)->where('status',3)->sum('refund_price');
} }
public function interest()
{
return $this->hasOne(StoreOrderInterest::class, 'order_id', 'order_id');
}
public function allowCreditPay()
{
return $this->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $this->status == self::STATUS_WAIT_PAY;
}
} }

View File

@ -0,0 +1,39 @@
<?php
namespace app\common\model\store\order;
use app\common\model\BaseModel;
class StoreOrderInterest extends BaseModel
{
const STATUS_SETTLED = 1; //已结算
const STATUS_UNSETTLED = 0; //未结算
const STATUS_DELETED = -1; //已删除
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'store_order_interest';
}
/**
* 计算利息
* @return string
*/
public function calculateInterest()
{
if ($this->start_time == '0000-00-00 00:00:00') {
return 0;
}
$days = ceil((time() - strtotime($this->start_time)) / 86400);
$days = max($days ,0);
$money = bcmul($this->total_price, ($this->rate / 100), 3);
return bcmul($days, $money, 2);
}
}

View File

@ -40,6 +40,10 @@ class Product extends BaseModel
const IS_SHOW = 1; //上架 const IS_SHOW = 1; //上架
const IS_NOT_SHOW = 0; //下架 const IS_NOT_SHOW = 0; //下架
const TYPE_NORMAL = 0; //普通商品
const TYPE_PURCHASE = 98; //采购商品
/** /**
* @Author:Qinii * @Author:Qinii
* @Date: 2020/5/8 * @Date: 2020/5/8

View File

@ -43,7 +43,7 @@ class ProductAttrValue extends BaseModel
public function getDetailAttr($value) public function getDetailAttr($value)
{ {
return json_decode($value); return json_decode($value, true);
} }
public function product() public function product()

View File

@ -0,0 +1,36 @@
<?php
namespace app\common\model\store\product;
use app\common\model\BaseModel;
use app\common\model\system\merchant\Merchant;
class PurchaseRecord extends BaseModel
{
public static function tablePk(): string
{
return 'id';
}
public static function tableName(): string
{
return 'purchase_record';
}
public function product()
{
return $this->hasOne(Product::class, 'product_id', 'product_id');
}
public function supplier()
{
return $this->hasOne(Merchant::class, 'mer_id', 'supplier_mer_id');
}
public function merchant()
{
return $this->hasOne(Merchant::class, 'mer_id', 'mer_id');
}
}

View File

@ -35,6 +35,7 @@ class Merchant extends BaseModel
const TypeTeamServer = 14; //小组服务团 const TypeTeamServer = 14; //小组服务团
const TypeVillageServer = 15; //村服务团队 const TypeVillageServer = 15; //村服务团队
const TypeTownServer = 16; //镇服务团队 const TypeTownServer = 16; //镇服务团队
const TypeTownSupplyChain = 17; //镇级供应链
const TypeMap = [ const TypeMap = [
self::TypeStore => '镇街店铺', self::TypeStore => '镇街店铺',
@ -44,16 +45,19 @@ class Merchant extends BaseModel
self::TypeTeamServer => '小组服务团', self::TypeTeamServer => '小组服务团',
self::TypeVillageServer => '村服务团队', self::TypeVillageServer => '村服务团队',
self::TypeTownServer => '镇服务团队', self::TypeTownServer => '镇服务团队',
self::TypeTownSupplyChain => '镇级供应链',
]; ];
const AllowApply = [ //允许申请的类型 const AllowApply = [ //允许申请的类型
self::TypeStore, self::TypeStore,
self::TypeSupplyChain, self::TypeSupplyChain,
self::TypeTownSupplyChain,
]; ];
const AllowDisplay = [ //允许展示的类型 const AllowDisplay = [ //允许展示的类型
self::TypeStore, self::TypeStore,
self::TypeCloudWarehouse, self::TypeCloudWarehouse,
self::TypeSupplyChain, self::TypeSupplyChain,
self::TypePlatform, self::TypePlatform,
self::TypeTownSupplyChain,
]; ];
/** /**

View File

@ -13,7 +13,15 @@
namespace app\common\repositories\community; namespace app\common\repositories\community;
use app\common\dao\community\CommunityDao; use app\common\dao\community\CommunityDao;
use app\common\dao\store\order\StoreCartDao;
use app\common\model\community\Community;
use app\common\model\store\order\StoreCart;
use app\common\model\store\product\ProductAttrValue;
use app\common\model\store\product\PurchaseRecord;
use app\common\model\store\Resale;
use app\common\model\store\Entrust;
use app\common\repositories\BaseRepository; use app\common\repositories\BaseRepository;
use app\common\repositories\store\order\StoreCartRepository;
use app\common\repositories\store\order\StoreOrderProductRepository; use app\common\repositories\store\order\StoreOrderProductRepository;
use app\common\repositories\store\product\SpuRepository; use app\common\repositories\store\product\SpuRepository;
use app\common\repositories\system\RelevanceRepository; use app\common\repositories\system\RelevanceRepository;
@ -38,8 +46,14 @@ class CommunityRepository extends BaseRepository
'is_del' => 0, 'is_del' => 0,
]; ];
public const COMMUNIT_TYPE_FONT = '1'; public const COMMUNIT_TYPE_FONT = '1';
public const COMMUNIT_TYPE_VIDEO = '2'; public const COMMUNIT_TYPE_VIDEO = '2';
public const COMMUNITY_TYPE_RESALE = 3; //转售贴
public const COMMUNITY_TYPE_ENTRUST = 4; //委托销售贴
public const RESALE_TYPE_STORE = 1; //到店核销
public const RESALE_TYPE_DELIVER = 2; //快递配送
public const RESALE_TYPE_TRANSFER = 1; //调货
public const RESALE_TYPE_DISCOUNT = 2; //打折
/** /**
* CommunityRepository constructor. * CommunityRepository constructor.
@ -81,6 +95,11 @@ class CommunityRepository extends BaseRepository
]); ]);
$count = $query->count(); $count = $query->count();
$list = $query->page($page, $limit)->select(); $list = $query->page($page, $limit)->select();
foreach($list as $key=>$val) {
$merInfo = Db::name('StoreService')->alias('ss')->leftJoin('Merchant m','ss.mer_id = M.mer_id')->where('ss.uid', $val['uid'])->field('m.mer_avatar, m.mer_name')->find();
$list[$key]['mer_name'] = $merInfo['mer_name'] ?? '';
$list[$key]['mer_avatar'] = $merInfo['mer_avatar'] ?? '';
}
return compact('count','list'); return compact('count','list');
} }
@ -88,10 +107,12 @@ class CommunityRepository extends BaseRepository
public function getApiList(array $where, int $page, int $limit, $userInfo) public function getApiList(array $where, int $page, int $limit, $userInfo)
{ {
$config = systemConfig("community_app_switch"); $config = systemConfig("community_app_switch");
if (!isset($where['is_type']) && $config) $where['is_type'] = $config; // if (!isset($where['is_type']) && $config) $where['is_type'] = is_array($config) ? implode(',', $config) : $config;
if (empty($where['is_type'])) $where['is_type'] = '1,2';
$where['is_del'] = 0; $where['is_del'] = 0;
$query = $this->dao->search($where)->when(in_array(self::COMMUNITY_TYPE_RESALE, explode(',', $where['is_type'])), function ($query) {
$query = $this->dao->search($where)->order('start DESC,Community.create_time DESC,community_id DESC'); $query->where('is_sale', 0);
})->order('start DESC,Community.create_time DESC,community_id DESC');
$query->with([ $query->with([
'author' => function($query) use($userInfo){ 'author' => function($query) use($userInfo){
$query->field('uid,real_name,status,avatar,nickname,count_start'); $query->field('uid,real_name,status,avatar,nickname,count_start');
@ -110,13 +131,30 @@ class CommunityRepository extends BaseRepository
], ],
'is_fans' => function($query) use($userInfo){ 'is_fans' => function($query) use($userInfo){
$query->where('left_id',$userInfo->uid?? 0); $query->where('left_id',$userInfo->uid?? 0);
} },
'resale',
]); ]);
$count = $query->count(); $count = $query->count();
$list = $query->page($page, $limit)->setOption('field',[]) $list = $query->page($page, $limit)->setOption('field',[])
->field('community_id,title,image,topic_id,Community.count_start,count_reply,start,Community.create_time,Community.uid,Community.status,is_show,content,video_link,is_type,refusal') ->field('community_id,title,image,resale_type,topic_id,Community.count_start,count_reply,start,Community.create_time,Community.uid,Community.status,is_show,content,video_link,is_type,refusal')
->select()->append(['time']); ->select()->append(['time']);
if ($list) $list = $list->toArray(); if ($list) $list = $list->toArray();
foreach ($list as $k => $item) {
if ($item['is_type'] == self::COMMUNITY_TYPE_RESALE) {
$list[$k]['total_price'] = '0';
foreach ($item['resale'] as $value) {
$list[$k]['total_price'] = bcadd($list[$k]['total_price'], bcmul($value['price'], $value['number'], 2), 2);
}
$list[$k]['mer_name'] = '';
$list[$k]['mer_avatar'] = '';
$merInfo = Db::name('StoreService')->alias('ss')->leftJoin('Merchant m','ss.mer_id = M.mer_id')->where('ss.uid', $item['uid'])->field('m.mer_avatar, m.mer_name')->find();
if ($merInfo) {
$list[$k]['mer_name'] = $merInfo['mer_name'];
$list[$k]['mer_avatar'] = $merInfo['mer_avatar'];
}
}
}
return compact('count','list'); return compact('count','list');
} }
@ -186,7 +224,7 @@ class CommunityRepository extends BaseRepository
]; ];
$config = systemConfig("community_app_switch"); $config = systemConfig("community_app_switch");
if ($config) $where['is_type'] = $config; if ($config) $where['is_type'] = $config;
return $this->dao->getSearch($where)->with([ $info = $this->dao->getSearch($where)->with([
'author' => function($query) { 'author' => function($query) {
$query->field('uid,real_name,status,avatar,nickname,count_start'); $query->field('uid,real_name,status,avatar,nickname,count_start');
}, },
@ -194,6 +232,12 @@ class CommunityRepository extends BaseRepository
'category', 'category',
'relevance.spu' 'relevance.spu'
])->find(); ])->find();
if ($info){
$merInfo = Db::name('StoreService')->alias('ss')->leftJoin('Merchant m','ss.mer_id = M.mer_id')->where('ss.uid', $info['uid'])->field('m.mer_avatar, m.mer_name')->find();
$info['mer_name'] = $merInfo['mer_name'] ?? '';
$info['mer_avatar'] = $merInfo['mer_avatar'] ?? '';
}
return $info;
} }
/** /**
@ -236,6 +280,11 @@ class CommunityRepository extends BaseRepository
'is_start' => function ($query) use ($user) { 'is_start' => function ($query) use ($user) {
$query->where('left_id', $user->uid ?? ''); $query->where('left_id', $user->uid ?? '');
}, },
'resale' => [
// 'spu' => function ($query) {
// $query->field('spu_id,store_name,image,price,product_type,activity_id,product_id');
// }
],
])->hidden(['is_del'])->find(); ])->hidden(['is_del'])->find();
if (!$data) throw new ValidateException('内容不存在,可能已被删除了哦~'); if (!$data) throw new ValidateException('内容不存在,可能已被删除了哦~');
@ -249,6 +298,28 @@ class CommunityRepository extends BaseRepository
'type' => RelevanceRepository::TYPE_COMMUNITY_FANS, 'type' => RelevanceRepository::TYPE_COMMUNITY_FANS,
]); ]);
$data['is_fans'] = $is_fans; $data['is_fans'] = $is_fans;
if ($data['is_type'] == self::COMMUNITY_TYPE_RESALE) {
$data['total_price'] = '0';
foreach ($data['resale'] as $k=>$value) {
$data['total_price'] = bcadd($data['total_price'], bcmul($value['price'], $value['number'], 2), 2);
$attrInfo = Db::name('StoreProduct')->alias('sp')->leftJoin('StoreProductAttrValue sv','sp.product_id = sv.product_id')->where('sv.unique', $value['product_attr_unique'])->field('sv.detail, sv.sku, sv.sales, sp.store_name, sp.image')->find();
$data['resale'][$k]['sku'] = $attrInfo['sku'] ?? '';
$data['resale'][$k]['sales'] = $attrInfo['sales'] ?? 0;
$data['resale'][$k]['store_name'] = $attrInfo['store_name'] ?? '';
$data['resale'][$k]['image'] = $attrInfo['image'] ?? '';
}
$data['mer_avatar'] = '';
$data['mer_name'] = '';
$data['sales'] = 0;
$data['care_count'] = 0;
$merInfo = Db::name('StoreService')->alias('ss')->leftJoin('Merchant m','ss.mer_id = m.mer_id')->where('ss.uid', $data['uid'])->field('m.mer_avatar, m.mer_name, m.sales, m.care_count')->find();
if ($merInfo) {
$data['mer_avatar'] = $merInfo['mer_avatar'];
$data['mer_name'] = $merInfo['mer_name'];
$data['sales'] = $merInfo['sales'];
$data['care_count'] = $merInfo['care_count'];
}
}
return $data; return $data;
} }
@ -302,6 +373,12 @@ class CommunityRepository extends BaseRepository
return Db::transaction(function () use($data) { return Db::transaction(function () use($data) {
$community = $this->dao->create($data); $community = $this->dao->create($data);
if ($data['spu_id'])$this->joinProduct($community->community_id,$data['spu_id']); if ($data['spu_id'])$this->joinProduct($community->community_id,$data['spu_id']);
if ($data['product_info'] && $data['is_type'] == self::COMMUNITY_TYPE_RESALE) {
$this->resale($community->community_id, $data['product_info'], $data['resale_type'] ?? 0);
}
if ($data['product_info'] && $data['is_type'] == self::COMMUNITY_TYPE_ENTRUST) {
$this->entrust($community->community_id, $data['product_info'], $data['entrust_mer_id'] ?? 0, $data['entrust_day'] ?? 0);
}
event('community.create',compact('community')); event('community.create',compact('community'));
return $community->community_id; return $community->community_id;
}); });
@ -326,9 +403,16 @@ class CommunityRepository extends BaseRepository
Db::transaction(function () use($id, $data) { Db::transaction(function () use($id, $data) {
$spuId = $data['spu_id']; $spuId = $data['spu_id'];
unset($data['spu_id']); $productInfo = $data['product_info'];
unset($data['spu_id'], $data['product_info']);
$community = $this->dao->update($id, $data); $community = $this->dao->update($id, $data);
if ($spuId) $this->joinProduct($id, $spuId); if ($spuId) $this->joinProduct($id, $spuId);
if ($productInfo && $data['is_type'] == self::COMMUNITY_TYPE_RESALE) {
$this->resale($id, $productInfo, $data['resale_type'] ?? 0);
}
if ($productInfo && $data['is_type'] == self::COMMUNITY_TYPE_ENTRUST) {
$this->entrust($community->community_id, $data['product_info'], $data['entrust_mer_id'] ?? 0, $data['entrust_day'] ?? 0);
}
event('community.update.before',compact('id','community')); event('community.update.before',compact('id','community'));
}); });
} }
@ -460,11 +544,12 @@ class CommunityRepository extends BaseRepository
$ret = $this->dao->get($id); $ret = $this->dao->get($id);
event('community.status.before',compact('id','data')); event('community.status.before',compact('id','data'));
Db::transaction(function () use($ret,$id, $data) { Db::transaction(function () use($ret,$id, $data) {
if ($data['status'] == 1) { if ($data['status'] == 1) {
$make = app()->make(UserBrokerageRepository::class); $make = app()->make(UserBrokerageRepository::class);
$make->incMemberValue($ret['uid'], 'member_community_num', $id); $make->incMemberValue($ret['uid'], 'member_community_num', $id);
Db::name('resale')->where('community_id', $id)->update(['float_rate' => $data['float_rate'] ?? 0]);
} }
unset($data['float_rate']);
$data['status_time'] = date('Y-m-d H:i;s', time()); $data['status_time'] = date('Y-m-d H:i;s', time());
$this->dao->update($id, $data); $this->dao->update($id, $data);
event('community.status',compact('id')); event('community.status',compact('id'));
@ -506,5 +591,186 @@ class CommunityRepository extends BaseRepository
return $make->getWechatQrcodePath($name, $link, false, $key); return $make->getWechatQrcodePath($name, $link, false, $key);
} }
} }
/**
* 转售贴
* @param $id
* @param array $data
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function resale($id, array $data, $resaleType = 0)
{
$insert = [];
foreach ($data as $value) {
if (isset($value['id'])) {
$resale = Resale::find($value['id']);
unset($value['product_attr_unique']);
$resale->update($value);
continue;
}
$purchaseRecord = PurchaseRecord::where('unique', $value['product_attr_unique'])->find();
// $exist = Resale::where('purchase_record_id', $purchaseRecord['id'])->find();
// if ($exist) {
// throw new ValidateException('已发起转售');
// }
$totalNumber = PurchaseRecord::where('unique', $value['product_attr_unique'])->sum('number');
$totalSalesVolume = PurchaseRecord::where('unique', $value['product_attr_unique'])->sum('sales_volume');
if (empty($purchaseRecord) || ($totalNumber - $totalSalesVolume) <= 0) {
throw new ValidateException('进货记录不存在或已售罄');
}
if (($totalNumber - $totalSalesVolume) < $value['number']) {
throw new ValidateException('库存不足');
}
if ($value) {
$insert[] = [
'community_id' => $id,
'purchase_record_id' => $purchaseRecord['id'],
'product_id' => $purchaseRecord['product_id'],
'product_attr_unique' => $purchaseRecord['unique'],
'mer_id' => $purchaseRecord['mer_id'],
'number' => $value['number'],
'price' => $value['price'],
'resale_type' => $resaleType,
'deliver_method' => $value['deliver_method'] ?? '',
'update_time' => date('Y-m-d H:i:s'),
];
}
$purchaseRecord->product->stock -= $value['number'];
$purchaseRecord->product->save();
$attrValue = ProductAttrValue::where('product_id', $purchaseRecord['product_id'])->where('unique', $purchaseRecord['unique'])->find();
$attrValue->stock -= $value['number'];
$attrValue->save();
}
if ($insert) {
Resale::getInstance()->insertAll($insert);
}
}
/**
* 委托贴
* @param $id
* @param array $data
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function entrust($id, array $data, $entrustMerId, $entrustDay)
{
$insert = [];
foreach ($data as $value) {
if (isset($value['id'])) {
$entrustInfo = Entrust::find($value['id']);
unset($value['product_attr_unique']);
$entrustInfo->update($value);
continue;
}
$purchaseRecord = PurchaseRecord::where('unique', $value['product_attr_unique'])->find();
$totalNumber = PurchaseRecord::where('unique', $value['product_attr_unique'])->sum('number');
$totalSalesVolume = PurchaseRecord::where('unique', $value['product_attr_unique'])->sum('sales_volume');
if (empty($purchaseRecord) || ($totalNumber - $totalSalesVolume) <= 0) {
throw new ValidateException('进货记录不存在或已售罄');
}
if (($totalNumber - $totalSalesVolume) < $value['number']) {
throw new ValidateException('库存不足');
}
if ($value) {
$insert[] = [
'community_id' => $id,
'purchase_record_id' => $purchaseRecord['id'],
'product_id' => $purchaseRecord['product_id'],
'product_attr_unique' => $purchaseRecord['unique'],
'mer_id' => $purchaseRecord['mer_id'],
'entrust_mer_id' => $entrustMerId,
'entrust_day' => $entrustDay,
'number' => $value['number'],
'price' => $value['price'],
'update_time' => date('Y-m-d H:i:s'),
];
}
$purchaseRecord->product->stock -= $value['number'];
$purchaseRecord->product->save();
$attrValue = ProductAttrValue::where('product_id', $purchaseRecord['product_id'])->where('unique', $purchaseRecord['unique'])->find();
$attrValue->stock -= $value['number'];
$attrValue->save();
}
if ($insert) {
Entrust::getInstance()->insertAll($insert);
}
}
/**
* 转售加入购物车
* @param $uid
* @param $id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function addCart($uid, $id)
{
$where = [
$this->dao->getPk() => $id,
'is_del' => 0
];
$community = $this->dao->getSearch($where)->with('resale')->find()->toArray();
if (empty($community) || $community['is_sale'] != 0) {
throw new ValidateException('转售数据不存在或已售出');
}
if (empty($community['resale'])) {
throw new ValidateException('转售数据不存在');
}
StoreCart::startTrans();
try {
/** @var StoreCartRepository $cartRepo */
$cartRepo = app()->make(StoreCartRepository::class);
$cartIds = [];
foreach ($community['resale'] as $item) {
$data = [
'uid' => $uid,
'mer_id' => $item['mer_id'],
'product_type' => 98,
'product_id' => $item['product_id'],
'product_attr_unique' => $item['product_attr_unique'],
'cart_num' => $item['number'],
'source' => StoreCartDao::SOURCE_COMMUNITY_RESALE,
'source_id' => $community['community_id'],
];
$cart = $cartRepo->create($data);
$cartIds[] = $cart['cart_id'];
}
if (empty($cartIds)) {
throw new ValidateException('加入购物车出错');
}
StoreCart::commit();
return $cartIds;
} catch (\Exception $exception) {
StoreCart::rollback();
throw new ValidateException('下单出错');
}
}
public function saleOrCancel($id, $status = 1)
{
$where = [
$this->dao->getPk() => $id,
'is_del' => 0
];
$community = $this->dao->getSearch($where)->with('resale')->find();
$community->is_sale = $status;
$community->save();
foreach ($community->resale as $item) {
$item->status = $status;
$item->save();
}
}
} }

View File

@ -34,6 +34,16 @@ class CityAreaRepository extends BaseRepository
return $this->search(['pid' => $pid])->select(); return $this->search(['pid' => $pid])->select();
} }
public function getGeoChildren($where)
{
return $this->searchGeo($where)->select();
}
public function getBrigade($where)
{
return $this->searchBrigade($where)->select();
}
public function getList($where) public function getList($where)
{ {
return $this->dao->getSearch($where)->with(['parent'])->order('id ASC')->select()->append(['children','hasChildren']); return $this->dao->getSearch($where)->with(['parent'])->order('id ASC')->select()->append(['children','hasChildren']);

View File

@ -0,0 +1,63 @@
<?php
namespace app\common\repositories\store\order;
use app\common\model\store\product\PurchaseRecord;
use app\common\repositories\BaseRepository;
class PurchaseRecordRepository extends BaseRepository
{
/**
* 扣销量
* @param $productId
* @param $unique
* @param $desc
* @return void
*/
public function descSalesVolume($productId, $unique, $desc)
{
while ($desc > 0) {
$purchaseRecord = $this->getPurchaseRecord2($productId, $unique);
if (!$purchaseRecord) {
break;
}
$number = min($desc, $purchaseRecord->sales_volume);
$purchaseRecord->sales_volume -= $number;
$purchaseRecord->save();
$desc -= $number;
}
}
/**
* 加销量
* @param $productId
* @param $unique
* @param $inc
* @return void
*/
public function incSalesVolume($productId, $unique, $inc)
{
while ($inc > 0) {
$purchaseRecord = $this->getPurchaseRecord($productId, $unique);
if (!$purchaseRecord) {
break;
}
$stock = $purchaseRecord->number - $purchaseRecord->sales_volume;
$purchaseRecord->sales_volume += min($inc, $stock);
$purchaseRecord->save();
$inc -= $stock;
}
}
public function getPurchaseRecord($productId, $unique)
{
return PurchaseRecord::where('product_id', $productId)->where('unique', $unique)->whereRaw('sales_volume<number')->order('id asc')->find();
}
public function getPurchaseRecord2($productId, $unique)
{
return PurchaseRecord::where('product_id', $productId)->where('unique', $unique)->where('sales_volume', '>', 0)->order('id desc')->find();
}
}

View File

@ -15,12 +15,16 @@ namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreGroupOrderDao; use app\common\dao\store\order\StoreGroupOrderDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\BaseRepository; use app\common\repositories\BaseRepository;
use app\common\repositories\store\coupon\StoreCouponRepository; use app\common\repositories\store\coupon\StoreCouponRepository;
use app\common\repositories\store\coupon\StoreCouponUserRepository; use app\common\repositories\store\coupon\StoreCouponUserRepository;
use app\common\repositories\user\UserBillRepository; use app\common\repositories\user\UserBillRepository;
use app\common\repositories\user\UserRepository; use app\common\repositories\user\UserRepository;
use crmeb\jobs\CancelGroupOrderJob; use crmeb\jobs\CancelGroupOrderJob;
use think\db\exception\DataNotFoundException;
use think\exception\ValidateException; use think\exception\ValidateException;
use think\facade\Db; use think\facade\Db;
use think\facade\Queue; use think\facade\Queue;
@ -60,11 +64,41 @@ class StoreGroupOrderRepository extends BaseRepository
*/ */
public function getList(array $where, $page, $limit) public function getList(array $where, $page, $limit)
{ {
$query = $this->search($where); $query = StoreGroupOrder::getDB()->alias('StoreGroupOrder');
if (isset($where['product_type'])) {
$storeOrderWhere = StoreOrder::where('activity_type', $where['product_type']);
$query->hasWhere('orderList', $storeOrderWhere);
}
$query->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) {
if ($where['paid'] == 0) {
$query->whereRaw("(StoreGroupOrder.paid=0 and status!=12) or (StoreGroupOrder.paid=1 and StoreGroupOrder.pay_type=8 and StoreOrder.status=2)");
} else {
$query->where('StoreGroupOrder.paid', $where['paid']);
}
})->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
$query->where('StoreGroupOrder.uid', $where['uid']);
})->order('create_time DESC')->when(isset($where['is_del']) && $where['is_del'] !== '', function ($query) use ($where) {
$query->where('StoreGroupOrder.is_del', $where['is_del']);
}, function ($query) {
$query->where('StoreGroupOrder.is_del', 0);
});
$count = $query->count(); $count = $query->count();
$list = $query->with(['orderList' => function (Relation $query) { $groupList = $query->with(['orderList' => function (Relation $query) {
$query->field('order_id,group_order_id,activity_type,pay_price')->with(['orderProduct','presellOrder']); $query->field('order_id,group_order_id,activity_type,pay_price,status,mer_id')->with(['merchant' => function ($query) {
}])->page($page, $limit)->order('create_time DESC')->select(); $query->field('mer_id,mer_name,settle_cycle,interest_rate');
}, 'orderProduct','presellOrder']);
}, 'interest'])->page($page, $limit)->order('create_time DESC')->select();
$list = [];
foreach ($groupList as $k => $item) {
$current = $item->toArray();
if (!empty($item->interest)) {
$interest = $item->interest->calculateInterest();
$current['interest']['total_amount'] = bcadd($item->interest->total_price, $interest, 2);
} else {
$current['interest']['total_amount'] = $item['total_price'];
}
$list[] = $current;
}
return compact('count', 'list'); return compact('count', 'list');
} }
@ -81,13 +115,26 @@ class StoreGroupOrderRepository extends BaseRepository
public function detail($uid, $id, $flag = true) public function detail($uid, $id, $flag = true)
{ {
$where = $this->getAll ? ['uid' => $uid] : ['paid' => 0, 'uid' => $uid]; $where = $this->getAll ? ['uid' => $uid] : ['paid' => 0, 'uid' => $uid];
return $this->search($where)->where('group_order_id', $id)->with(['orderList' => function (Relation $query) use ($flag) { $order = StoreGroupOrder::where($where)
$query->when($flag, function ($query) { ->where('group_order_id', $id)
$query->field('order_id,group_order_id,mer_id,order_sn,activity_type,pay_price,order_extend,order_type,is_virtual'); ->where('is_del', 0)
})->with(['merchant' => function ($query) use ($flag) { ->with(['orderList' => function (Relation $query) use ($flag) {
$flag && $query->field('mer_id,mer_name'); $query->when($flag, function ($query) {
}, 'orderProduct', 'presellOrder']); $query->field('order_id,group_order_id,mer_id,order_sn,activity_type,pay_price,order_extend,order_type,is_virtual');
}])->find(); })->with(['merchant' => function ($query) use ($flag) {
$flag && $query->field('mer_id,mer_name,settle_cycle,interest_rate');
}, 'orderProduct', 'presellOrder']);
}, 'interest'])
->order('create_time DESC')->append(['cancel_time', 'cancel_unix'])->find();
if (empty($order)) {
throw new DataNotFoundException('订单不存在或已取消');
}
if (!empty($order->interest)) {
$interest = $order->interest->calculateInterest();
$order->interest->interest = $interest;
$order->interest->total_amount = bcadd($order->interest->total_price, $interest, 2);
}
return $order;
} }
public function status($uid, $id) public function status($uid, $id)
@ -163,6 +210,10 @@ class StoreGroupOrderRepository extends BaseRepository
'user_type' => $storeOrderStatusRepository::U_TYPE_SYSTEM, 'user_type' => $storeOrderStatusRepository::U_TYPE_SYSTEM,
]; ];
} }
if (!empty($order->interest) && $order->interest->status == StoreOrderInterest::STATUS_UNSETTLED) {
$order->interest->status = StoreOrderInterest::STATUS_DELETED;
$order->interest->save();
}
$groupOrder->save(); $groupOrder->save();
$storeOrderStatusRepository->batchCreateLog($orderStatus); $storeOrderStatusRepository->batchCreateLog($orderStatus);
}); });

View File

@ -3,6 +3,9 @@
namespace app\common\repositories\store\order; namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreCartDao; use app\common\dao\store\order\StoreCartDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder;
use app\common\repositories\community\CommunityRepository;
use app\common\repositories\store\coupon\StoreCouponRepository; use app\common\repositories\store\coupon\StoreCouponRepository;
use app\common\repositories\store\coupon\StoreCouponUserRepository; use app\common\repositories\store\coupon\StoreCouponUserRepository;
use app\common\repositories\store\product\ProductAssistSkuRepository; use app\common\repositories\store\product\ProductAssistSkuRepository;
@ -41,7 +44,6 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$addressRepository = app()->make(UserAddressRepository::class); $addressRepository = app()->make(UserAddressRepository::class);
$address = $addressRepository->getWhere(['uid' => $uid, 'address_id' => $addressId]); $address = $addressRepository->getWhere(['uid' => $uid, 'address_id' => $addressId]);
} }
$storeCartRepository = app()->make(StoreCartRepository::class); $storeCartRepository = app()->make(StoreCartRepository::class);
$res = $storeCartRepository->checkCartList($storeCartRepository->cartIbByData($cartId, $uid, $address), 0, $user); $res = $storeCartRepository->checkCartList($storeCartRepository->cartIbByData($cartId, $uid, $address), 0, $user);
$merchantCartList = $res['list']; $merchantCartList = $res['list'];
@ -95,8 +97,29 @@ class StoreOrderCreateRepository extends StoreOrderRepository
} }
} }
} }
if ($order_type == 98 && count($merchantCartList) > 1) {
throw new ValidateException('采购商品不支持跨店购买');
}
$community = [];
if ($order_type == 98) {
$sourceIdArray = [];
foreach($merchantCart['list'] as $prod){
if ($prod['source_id'] > 0) {
$sourceIdArray[] = $prod['source_id'];
}
}
if (count($sourceIdArray)) {
if (count(array_unique($sourceIdArray)) > 1) {
throw new ValidateException('转售商品数据异常');
}
$community = Db::name('Community')->where('community_id', $communityIdArray[0] ?? 0)->field('community_id, title, image')->fetchSql(false)->find();
if ($community) {
$deliverMethod = Db::name('resale')->where('community_id', $communityIdArray[0] ?? 0)->value('deliver_method');
$deliverMethodArray = explode(',', $deliverMethod);
}
}
}
unset($merchantCart, $cart); unset($merchantCart, $cart);
$order_price = 0; $order_price = 0;
$total_true_price = 0; $total_true_price = 0;
$order_total_price = 0; $order_total_price = 0;
@ -113,11 +136,13 @@ class StoreOrderCreateRepository extends StoreOrderRepository
app()->make(StoreDiscountRepository::class) app()->make(StoreDiscountRepository::class)
->check($merchantCartList[0]['list'][0]['source_id'], $merchantCartList[0]['list'], $user); ->check($merchantCartList[0]['list'][0]['source_id'], $merchantCartList[0]['list'], $user);
} }
$orderDeliveryStatus = true; $orderDeliveryStatus = true;
$order_svip_discount = 0; $order_svip_discount = 0;
// 循环计算每个店铺的订单数据 // 循环计算每个店铺的订单数据
foreach ($merchantCartList as &$merchantCart) { foreach ($merchantCartList as &$merchantCart) {
if ($order_type == 98 && !empty($deliverMethodArray)) {
$merchantCart['delivery_way'] = $deliverMethodArray;
}
$postageRule = []; $postageRule = [];
$total_price = 0; $total_price = 0;
$total_num = 0; $total_num = 0;
@ -147,6 +172,10 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$product_cart = []; $product_cart = [];
foreach ($merchantCart['list'] as $k => $cart) { foreach ($merchantCart['list'] as $k => $cart) {
//处理转售送货方式
if ($order_type == 98) {
$merchantCart['list'][$k]['product']['delivery_way'] = $cart['product']['delivery_way'] = $deliverMethod ?? '';
}
//获取订单类型, 活动商品单次只能购买一个 //获取订单类型, 活动商品单次只能购买一个
if ($cart['product']['delivery_way']) { if ($cart['product']['delivery_way']) {
$delivery_way = explode(',', $cart['product']['delivery_way']); $delivery_way = explode(',', $cart['product']['delivery_way']);
@ -208,7 +237,6 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$use_svip = 0; $use_svip = 0;
//获取运费规则和统计商品数据 //获取运费规则和统计商品数据
foreach ($merchantCart['list'] as &$cart) { foreach ($merchantCart['list'] as &$cart) {
if ($cart['product_type'] == 10 && $cart['productDiscountAttr']) { if ($cart['product_type'] == 10 && $cart['productDiscountAttr']) {
$cart['productAttr']['price'] = $cart['productDiscountAttr']['active_price']; $cart['productAttr']['price'] = $cart['productDiscountAttr']['active_price'];
$cart['productAttr']['show_svip_price'] = false; $cart['productAttr']['show_svip_price'] = false;
@ -218,8 +246,13 @@ class StoreOrderCreateRepository extends StoreOrderRepository
throw new ValidateException('购买商品数必须大于0'); throw new ValidateException('购买商品数必须大于0');
} }
$svip_discount = 0; $svip_discount = 0;
$realPrice = $this->cartByPrice($cart);
$price = bcmul($cart['cart_num'], $this->cartByPrice($cart), 2); if ($cart['product_type'] == 98) {
$cart['product']['price'] = $realPrice;
$cart['productAttr']['price'] = $realPrice;
$cart['productAttr']['stock'] = $cart['cart_num'];
}
$price = bcmul($cart['cart_num'], $realPrice, 2);
$cart['total_price'] = $price; $cart['total_price'] = $price;
$cart['postage_price'] = 0; $cart['postage_price'] = 0;
$cart['svip_discount'] = 0; $cart['svip_discount'] = 0;
@ -881,6 +914,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository
'order_total_postage', 'order_total_postage',
'order_price', 'order_price',
'total_price', 'total_price',
'community',
'platformCoupon', 'platformCoupon',
'enabledPlatformCoupon', 'enabledPlatformCoupon',
'usePlatformCouponId', 'usePlatformCouponId',
@ -912,7 +946,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository
if ($orderInfo['order_price'] > 1000000) { if ($orderInfo['order_price'] > 1000000) {
throw new ValidateException('支付金额超出最大限制'); throw new ValidateException('支付金额超出最大限制');
} }
if ($orderInfo['status'] == 'noDeliver') throw new ValidateException('部分商品不支持该区域'); if ($orderInfo['status'] == 'noDeliver') throw new ValidateException('商品不支持该区域');
if ($orderInfo['status'] == 'noAddress') throw new ValidateException('请选择地址'); if ($orderInfo['status'] == 'noAddress') throw new ValidateException('请选择地址');
if (!$order_model && $orderInfo['allow_address']) { if (!$order_model && $orderInfo['allow_address']) {
if (!$orderInfo['address']) throw new ValidateException('请选择正确的收货地址'); if (!$orderInfo['address']) throw new ValidateException('请选择正确的收货地址');
@ -924,7 +958,10 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$extend = []; $extend = [];
} }
$orderType = $orderInfo['order_type']; $orderType = $orderInfo['order_type'];
if ($orderType && (count($orderInfo['order']) > 1 || ($orderType != 10 && count($orderInfo['order'][0]['list']) > 1))) { if ($orderType == 0 && $pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
throw new ValidateException('该商品不支持先货后款');
}
if (!in_array($orderType, [0, 98]) && (count($orderInfo['order']) > 1 || ($orderType != 10 && count($orderInfo['order'][0]['list']) > 1))) {
throw new ValidateException('活动商品请单独购买'); throw new ValidateException('活动商品请单独购买');
} }
@ -939,6 +976,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
//检查发票状态 //检查发票状态
if (isset($receipt_data[$merchantCart['mer_id']]) && !$merchantCart['openReceipt']) if (isset($receipt_data[$merchantCart['mer_id']]) && !$merchantCart['openReceipt'])
throw new ValidateException('该店铺不支持开发票'); throw new ValidateException('该店铺不支持开发票');
if ($pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && !$merchantCart['credit_buy']) {
throw new ValidateException("{$merchantCart['mer_name']}不支持先货后款");
}
foreach ($merchantCart['list'] as $cart) { foreach ($merchantCart['list'] as $cart) {
if (!$cartSpread && $cart['spread_id']) { if (!$cartSpread && $cart['spread_id']) {
@ -946,6 +986,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
} }
} }
} }
if ($orderType == 98 && count($merchantCartList) > 1) {
throw new ValidateException('采购商品不支持跨店购买');
}
if ($hasTake) { if ($hasTake) {
app()->make(UserAddressValidate::class)->scene('take')->check($post); app()->make(UserAddressValidate::class)->scene('take')->check($post);
} }
@ -975,7 +1018,6 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$totalCost = 0; $totalCost = 0;
$cartIds = []; $cartIds = [];
$orderList = []; $orderList = [];
foreach ($merchantCartList as $k => $merchantCart) { foreach ($merchantCartList as $k => $merchantCart) {
$cost = 0; $cost = 0;
$total_extension_one = 0; $total_extension_one = 0;
@ -1058,7 +1100,8 @@ class StoreOrderCreateRepository extends StoreOrderRepository
} else if (isset($merchantCart['merchantCategory']['commission_rate']) && $merchantCart['merchantCategory']['commission_rate'] > 0) { } else if (isset($merchantCart['merchantCategory']['commission_rate']) && $merchantCart['merchantCategory']['commission_rate'] > 0) {
$rate = bcmul($merchantCart['merchantCategory']['commission_rate'], 100, 4); $rate = bcmul($merchantCart['merchantCategory']['commission_rate'], 100, 4);
} }
$user_address = isset($address) ? ($address['province'] . $address['city'] . $address['district'] . $address['street'] . $address['detail']) : ''; $user_address = isset($address) ? ($address['province'] . $address['city'] . $address['district'] . $address['street'] . $address['village'] . $address['brigade'] . $address['detail']) : '';
$user_address_code = isset($address) ? ($address['province_code'] . ',' . $address['city_code'] . ',' . $address['district_code'] . ',' . $address['street_code'] . ',' . $address['village_code'] . ',' . $address['brigade_id']) : '';
//整理订单数据 //整理订单数据
$_order = [ $_order = [
'cartInfo' => $merchantCart, 'cartInfo' => $merchantCart,
@ -1076,6 +1119,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository
'real_name' => $merchantCart['order']['isTake'] ? $post['real_name'] : ($address['real_name'] ?? ''), 'real_name' => $merchantCart['order']['isTake'] ? $post['real_name'] : ($address['real_name'] ?? ''),
'user_phone' => $merchantCart['order']['isTake'] ? $post['phone'] : ($address['phone'] ?? ''), 'user_phone' => $merchantCart['order']['isTake'] ? $post['phone'] : ($address['phone'] ?? ''),
'user_address' => $user_address, 'user_address' => $user_address,
'user_address_code' => $user_address_code,
'cart_id' => implode(',', array_column($merchantCart['list'], 'cart_id')), 'cart_id' => implode(',', array_column($merchantCart['list'], 'cart_id')),
'total_num' => $merchantCart['order']['total_num'], 'total_num' => $merchantCart['order']['total_num'],
'total_price' => $merchantCart['order']['total_price'], 'total_price' => $merchantCart['order']['total_price'],
@ -1125,7 +1169,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$group = Db::transaction(function () use ($ex, $user, $topUid, $spreadUid, $uid, $receipt_data, $cartIds, $allUseCoupon, $groupOrder, $orderList, $orderInfo) { $group = Db::transaction(function () use ($ex, $user, $topUid, $spreadUid, $uid, $receipt_data, $cartIds, $allUseCoupon, $groupOrder, $orderList, $orderInfo) {
$storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class); $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class);
$storeCartRepository = app()->make(StoreCartRepository::class); $storeCartRepository = app()->make(StoreCartRepository::class);
/** @var ProductAttrValueRepository $attrValueRepository */
$attrValueRepository = app()->make(ProductAttrValueRepository::class); $attrValueRepository = app()->make(ProductAttrValueRepository::class);
/** @var ProductRepository $productRepository */
$productRepository = app()->make(ProductRepository::class); $productRepository = app()->make(ProductRepository::class);
$storeOrderProductRepository = app()->make(StoreOrderProductRepository::class); $storeOrderProductRepository = app()->make(StoreOrderProductRepository::class);
$couponUserRepository = app()->make(StoreCouponUserRepository::class); $couponUserRepository = app()->make(StoreCouponUserRepository::class);
@ -1159,8 +1205,19 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$productRepository->descStock($cart['product']['old_product_id'], $cart['cart_num']); $productRepository->descStock($cart['product']['old_product_id'], $cart['cart_num']);
$attrValueRepository->descStock($cart['product']['old_product_id'], $cart['productAttr']['unique'], $cart['cart_num']); $attrValueRepository->descStock($cart['product']['old_product_id'], $cart['productAttr']['unique'], $cart['cart_num']);
} else { } else {
$attrValueRepository->descStock($cart['productAttr']['product_id'], $cart['productAttr']['unique'], $cart['cart_num']); if ($cart['source'] == StoreCartDao::SOURCE_COMMUNITY_RESALE) {
$productRepository->descStock($cart['product']['product_id'], $cart['cart_num']); /** @var CommunityRepository $communityRepository */
$communityRepository = app()->make(CommunityRepository::class);
$communityRepository->saleOrCancel($cart['source_id']);
$attrValueRepository->incSales($cart['productAttr']['product_id'], $cart['productAttr']['unique'], $cart['cart_num']);
$productRepository->incSales($cart['product']['product_id'], $cart['cart_num']);
} else {
$attrValueRepository->descStock($cart['productAttr']['product_id'], $cart['productAttr']['unique'], $cart['cart_num']);
$productRepository->descStock($cart['product']['product_id'], $cart['cart_num']);
}
/** @var PurchaseRecordRepository $purchaseRecordRepo */
$purchaseRecordRepo = app()->make(PurchaseRecordRepository::class);
$purchaseRecordRepo->incSalesVolume($cart['product']['product_id'], $cart['productAttr']['unique'], $cart['cart_num']);
if ($cart['integral'] && $cart['integral']['use'] > 0) { if ($cart['integral'] && $cart['integral']['use'] > 0) {
$productRepository->incIntegral($cart['product']['product_id'], $cart['integral']['use'], $cart['integral']['price']); $productRepository->incIntegral($cart['product']['product_id'], $cart['integral']['use'], $cart['integral']['price']);
} }
@ -1212,6 +1269,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$orderProduct = []; $orderProduct = [];
$orderStatus = []; $orderStatus = [];
foreach ($orderList as $order) { foreach ($orderList as $order) {
if ($order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
$order['status'] = StoreOrder::STATUS_WAIT_CONFIRM;
}
$cartInfo = $order['cartInfo']; $cartInfo = $order['cartInfo'];
unset($order['cartInfo']); unset($order['cartInfo']);
//创建子订单 //创建子订单

View File

@ -0,0 +1,28 @@
<?php
namespace app\common\repositories\store\order;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\BaseRepository;
class StoreOrderInterestRepository extends BaseRepository
{
public function create($data)
{
$data['status'] = StoreOrderInterest::STATUS_UNSETTLED;
$model = new StoreOrderInterest();
return $model->save($data);
}
public function getByGroupOrder($groupOrderId)
{
return StoreOrderInterest::where('group_order_id', $groupOrderId)->find();
}
public function getByOrder($orderId)
{
return StoreOrderInterest::where('order_id', $orderId)->find();
}
}

View File

@ -14,6 +14,9 @@ namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreOrderDao; use app\common\dao\store\order\StoreOrderDao;
use app\common\model\store\order\StoreGroupOrder; use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder; use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderInterest;
use app\common\model\store\order\StoreRefundOrder;
use app\common\model\store\product\PurchaseRecord;
use app\common\model\user\User; use app\common\model\user\User;
use app\common\repositories\BaseRepository; use app\common\repositories\BaseRepository;
use app\common\repositories\delivery\DeliveryOrderRepository; use app\common\repositories\delivery\DeliveryOrderRepository;
@ -74,7 +77,7 @@ class StoreOrderRepository extends BaseRepository
/** /**
* 支付类型 * 支付类型
*/ */
const PAY_TYPE = ['balance', 'weixin', 'routine', 'h5', 'alipay', 'alipayQr', 'weixinQr', 'scrcu']; const PAY_TYPE = ['balance', 'weixin', 'routine', 'h5', 'alipay', 'alipayQr', 'weixinQr', 'scrcu', 'creditBuy'];
const TYPE_SN_ORDER = 'wxo'; const TYPE_SN_ORDER = 'wxo';
const TYPE_SN_PRESELL = 'wxp'; const TYPE_SN_PRESELL = 'wxp';
@ -268,7 +271,9 @@ class StoreOrderRepository extends BaseRepository
$flag = false; $flag = false;
} }
} }
//发起物流信息处理
event('order.sendGoodsCode', $order);
// 商户流水账单数据 // 商户流水账单数据
$finance[] = [ $finance[] = [
'order_id' => $order->order_id, 'order_id' => $order->order_id,
@ -459,7 +464,6 @@ class StoreOrderRepository extends BaseRepository
}); });
event('order.take', compact('order')); event('order.take', compact('order'));
} }
} }
/** /**
@ -475,7 +479,7 @@ class StoreOrderRepository extends BaseRepository
try { try {
$this->batchPrinter($orderId, $merId); $this->batchPrinter($orderId, $merId);
} catch (Exception $exception) { } catch (Exception $exception) {
Log::info('自动打印小票报错' . $exception); Log::info('自动打印小票报错');
} }
} else { } else {
Log::info('自动打印小票验证商户ID【' . $merId . '】,自动打印状态未开启'); Log::info('自动打印小票验证商户ID【' . $merId . '】,自动打印状态未开启');
@ -522,6 +526,18 @@ class StoreOrderRepository extends BaseRepository
return $cart['productAssistAttr']['assist_price']; return $cart['productAssistAttr']['assist_price'];
} else if ($cart['product_type'] == '4') { } else if ($cart['product_type'] == '4') {
return $cart['activeSku']['active_price']; return $cart['activeSku']['active_price'];
// 更新调货价格
} else if ($cart['product_type'] == '98') {
if ($cart['source_id'] > 0) {
$price = Db::name('resale')->where('community_id', $cart['source_id'])->where('product_attr_unique', $cart['product_attr_unique'])->where('status', 0)->value('price');
if ($price) {
return $price;
} else {
throw new ValidateException('转售商品数据异常');
}
} else {
return $cart['productAttr']['price'];
}
} else { } else {
return $cart['productAttr']['price']; return $cart['productAttr']['price'];
} }
@ -537,6 +553,14 @@ class StoreOrderRepository extends BaseRepository
return 0; return 0;
} else if ($cart['product_type'] == '4') { } else if ($cart['product_type'] == '4') {
return 0; return 0;
// 更新调货价格
} else if ($cart['product_type'] == '98') {
$price = Db::name('resale')->where('product_attr_unique', $cart['product_attr_unique'])->where('status', 0)->value('price');
if ($price) {
return $price;
} else {
return $cart['productAttr']['price'];
}
} else { } else {
return $cart['productAttr']['price']; return $cart['productAttr']['price'];
} }
@ -560,16 +584,21 @@ class StoreOrderRepository extends BaseRepository
*/ */
public function userOrderNumber(int $uid, $product_type=0) public function userOrderNumber(int $uid, $product_type=0)
{ {
$noPay = app()->make(StoreGroupOrderRepository::class)->orderNumber($uid,$product_type); //activity_type0普通订单 98 采购订单
$noPostage = $this->dao->search(['uid' => $uid, 'status' => 0, 'paid' => 1,'is_user' => 1])->where('StoreOrder.is_del', 0)->count(); //$noPay = app()->make(StoreGroupOrderRepository::class)->orderNumber($uid, $product_type);
$all = $this->dao->search(['uid' => $uid, 'status' => -2,'is_user' => 1])->where('StoreOrder.is_del', 0)->count(); $isUser = 1;
$noDeliver = $this->dao->search(['uid' => $uid, 'status' => 1, 'paid' => 1])->where('StoreOrder.is_del', 0)->count(); if ($product_type == 98) {
$noComment = $this->dao->search(['uid' => $uid, 'status' => 2, 'paid' => 1,'is_user' => 1])->where('StoreOrder.is_del', 0)->count(); $isUser = 0;
$done = $this->dao->search(['uid' => $uid, 'status' => 3, 'paid' => 1,'is_user' => 1])->where('StoreOrder.is_del', 0)->count(); }
$refund = app()->make(StoreRefundOrderRepository::class)->getWhereCount(['uid' => $uid, 'status' => [0, 1, 2]]); $noPay = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(1))->whereRaw("(StoreOrder.paid=0 and StoreOrder.pay_type!=8) or (StoreOrder.paid=1 and StoreOrder.pay_type=8 and StoreOrder.status=2)")->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
//$orderPrice = $this->dao->search(['uid' => $uid, 'paid' => 1])->sum('pay_price'); $noPostage = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(2))->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
$orderCount = $this->dao->search(['uid' => $uid, 'paid' => 1,'is_user' => 1])->count(); $noDeliver = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(3))->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
return compact('noComment', 'done', 'refund', 'noDeliver', 'noPay', 'noPostage', 'orderCount', 'all'); $noComment = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(4))->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
$done = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(5))->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
$refund = StoreRefundOrder::alias('t1')->join('store_order t2', 't1.order_id=t2.order_id')->where('t1.uid', $uid)->where('t1.status', 3)->where('t2.activity_type', $product_type)->count();
$orderPrice = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where($this->getOrderType(8))->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->sum('pay_price');
$orderCount = $this->dao->search(['uid' => $uid, 'is_user' => $isUser])->where('activity_type', $product_type)->where('StoreOrder.is_del', 0)->fetchSql(false)->count();
return compact('noComment', 'done', 'refund', 'noDeliver', 'noPay', 'noPostage', 'orderPrice', 'orderCount');
} }
/** /**
@ -614,6 +643,7 @@ class StoreOrderRepository extends BaseRepository
$order->presell_price = $order->pay_price; $order->presell_price = $order->pay_price;
} }
} }
$order->order_status = $this->getOrderStatusV2($order);
return $order; return $order;
} }
@ -723,10 +753,16 @@ class StoreOrderRepository extends BaseRepository
public function takeAfter(StoreOrder $order, ?User $user) public function takeAfter(StoreOrder $order, ?User $user)
{ {
Db::transaction(function () use ($user, $order) { Db::transaction(function () use ($user, $order) {
if ($user) $this->computed($order, $user); if ($user && $order->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) $this->computed($order, $user);
Queue::push(SendSmsJob::class, ['tempId' => 'ORDER_TAKE_SUCCESS', 'id' => $order->order_id]); Queue::push(SendSmsJob::class, ['tempId' => 'ORDER_TAKE_SUCCESS', 'id' => $order->order_id]);
Queue::push(SendSmsJob::class, ['tempId' => 'ADMIN_TAKE_DELIVERY_CODE', 'id' => $order->order_id]); Queue::push(SendSmsJob::class, ['tempId' => 'ADMIN_TAKE_DELIVERY_CODE', 'id' => $order->order_id]);
app()->make(MerchantRepository::class)->computedLockMoney($order); if ($order->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
app()->make(MerchantRepository::class)->computedLockMoney($order);
}
if (!empty($order->interest) && $order->interest->status == StoreOrderInterest::STATUS_UNSETTLED) {
$order->interest->start_time = date('Y-m-d H:i:s', strtotime("+{$order->interest->settle_cycle} days"));
$order->interest->save();
}
$order->save(); $order->save();
}); });
} }
@ -793,13 +829,13 @@ class StoreOrderRepository extends BaseRepository
if ($orderType === 0) $where['order_type'] = 0; //普通订单 if ($orderType === 0) $where['order_type'] = 0; //普通订单
if ($orderType === 1) $where['take_order'] = 1; //已核销订单 if ($orderType === 1) $where['take_order'] = 1; //已核销订单
if ($product_type!=0) $where['product_type'] = $product_type; //商品属性 if ($product_type!=0) $where['product_type'] = $product_type; //商品属性
//1: 未支付 2: 未发货 3: 待收货 4: 待评价 5: 交易完成 6: 已退款 7: 已删除 //1: 未支付 2: 未发货 3: 待收货 4: 待评价 5: 交易完成 6: 已退款 7: 已删除 8: 已支付
$all = $this->dao->search($where, $sysDel)->where($this->getOrderType(0))->count(); $all = $this->dao->search($where, $sysDel)->where($this->getOrderType(0))->count();
$statusAll = $all; $statusAll = $all;
$unpaid = $this->dao->search($where, $sysDel)->where($this->getOrderType(1))->count(); $unpaid = $this->dao->search($where, $sysDel)->where($this->getOrderType(1))->whereRaw("StoreOrder.paid=0 or (StoreOrder.paid=1 and StoreOrder.pay_type=8 and StoreOrder.status=2)")->count();
$unshipped = $this->dao->search($where, $sysDel)->where($this->getOrderType(2))->count(); $unshipped = $this->dao->search($where, $sysDel)->where($this->getOrderType(2))->count();
$untake = $this->dao->search($where, $sysDel)->where($this->getOrderType(3))->count(); $untake = $this->dao->search($where, $sysDel)->where($this->getOrderType(3))->count();
$unevaluate = $this->dao->search($where, $sysDel)->where($this->getOrderType(4))->count(); $unevaluate = $this->dao->search($where, $sysDel)->where($this->getOrderType(4))->where('paid', 1)->where('pay_type', '<>', StoreGroupOrder::PAY_TYPE_CREDIT_BUY)->count();
$complete = $this->dao->search($where, $sysDel)->where($this->getOrderType(5))->count(); $complete = $this->dao->search($where, $sysDel)->where($this->getOrderType(5))->count();
$refund = $this->dao->search($where, $sysDel)->where($this->getOrderType(6))->count(); $refund = $this->dao->search($where, $sysDel)->where($this->getOrderType(6))->count();
$del = $this->dao->search($where, $sysDel)->where($this->getOrderType(7))->count(); $del = $this->dao->search($where, $sysDel)->where($this->getOrderType(7))->count();
@ -843,10 +879,10 @@ class StoreOrderRepository extends BaseRepository
$param['StoreOrder.is_del'] = 0; $param['StoreOrder.is_del'] = 0;
switch ($status) { switch ($status) {
case 1: case 1:
$param['paid'] = 0; // $param['StoreOrder.paid'] = 0;
break; // 未支付 break; // 未支付
case 2: case 2:
$param['paid'] = 1; $param['StoreOrder.paid'] = 1;
$param['StoreOrder.status'] = 0; $param['StoreOrder.status'] = 0;
break; // 待发货 break; // 待发货
case 3: case 3:
@ -863,11 +899,13 @@ class StoreOrderRepository extends BaseRepository
break; // 已退款 break; // 已退款
case 7: case 7:
$param['StoreOrder.is_del'] = 1; $param['StoreOrder.is_del'] = 1;
break; // 待核销 break; // 待核销 已删除
break; // 已删除 case 8:
$param['StoreOrder.paid'] = 1;
break; // 已支付
default: default:
unset($param['StoreOrder.is_del']); unset($param['StoreOrder.is_del']);
break; //全部 break; // 全部
} }
return $param; return $param;
} }
@ -1486,6 +1524,12 @@ class StoreOrderRepository extends BaseRepository
$status = $where['status']; $status = $where['status'];
unset($where['status']); unset($where['status']);
$query = $this->dao->search($where)->where($this->getOrderType($status)) $query = $this->dao->search($where)->where($this->getOrderType($status))
->when($status == 4, function ($query) {
$query->where('paid', 1)->where('pay_type', '<>', StoreGroupOrder::PAY_TYPE_CREDIT_BUY);
})
->when($status == 1, function ($query) {
$query->whereRaw("StoreOrder.paid=0 or (StoreOrder.paid=1 and StoreOrder.pay_type=8 and StoreOrder.status=2)");
})
->with([ ->with([
'orderProduct', 'orderProduct',
'merchant' => function ($query) { 'merchant' => function ($query) {
@ -1565,7 +1609,6 @@ class StoreOrderRepository extends BaseRepository
]); ]);
$count = $query->count(); $count = $query->count();
$list = $query->page($page, $limit)->select()->append(['refund_extension_one', 'refund_extension_two']); $list = $query->page($page, $limit)->select()->append(['refund_extension_one', 'refund_extension_two']);
return compact('count', 'list'); return compact('count', 'list');
} }
@ -1664,13 +1707,21 @@ class StoreOrderRepository extends BaseRepository
*/ */
public function getList(array $where, $page, $limit) public function getList(array $where, $page, $limit)
{ {
$query = $this->dao->search($where)->where('StoreOrder.is_del', 0); $status = $where['status'] ?? '';
unset($where['status']);
// 未支付订单
if ($status == 1) {
$query = $this->dao->search($where)->where($this->getOrderType($status))->whereRaw("(StoreOrder.paid=0 and StoreOrder.pay_type!=8) or (StoreOrder.paid=1 and StoreOrder.pay_type=8 and StoreOrder.status=2)")->where('StoreOrder.is_del', 0);
} else {
$query = $this->dao->search($where)->where($this->getOrderType($status))->where('StoreOrder.is_del', 0);
}
$count = $query->count(); $count = $query->count();
$list = $query->with([ $list = $query->with([
'orderProduct', 'orderProduct',
'presellOrder', 'presellOrder',
'merchant' => function ($query) { 'merchant' => function ($query) {
return $query->field('mer_id,mer_name'); return $query->field('mer_id,mer_name,settle_cycle,interest_rate');
}, },
'community', 'community',
'receipt' => function ($query) { 'receipt' => function ($query) {
@ -1687,11 +1738,48 @@ class StoreOrderRepository extends BaseRepository
$order->presell_price = $order->pay_price; $order->presell_price = $order->pay_price;
} }
} }
if ($order->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $order->interest) {
$order->interest_start_time = $order->interest->start_time;
$order->interest_status = $order->interest->status;
if ($order->interest_status == StoreOrderInterest::STATUS_SETTLED) {
$order->interest_money = $order->interest->interest;
} else {
$order->interest_money = $order->interest->calculateInterest();
}
}
$order->takeOrderCount = count($order['takeOrderList']); $order->takeOrderCount = count($order['takeOrderList']);
unset($order['takeOrderList']); $order->order_status = $this->getOrderStatusV2($order);
unset($order['takeOrderList'], $order->interest);
} }
return compact( 'count','list'); return compact( 'count','list', 'where');
}
public function getOrderStatusV2($order) {
// 订单状态 1 未支付 2待发货 3待收货 4待评价 5交易完成 6已退款 7待核销
$order->order_status = 0;
if ($order->paid == 0) {
$order->order_status = 1;
}
if ($order->paid == 1 && $order->status == 0) {
$order->order_status = 2;
}
if ($order->status == 1) {
$order->order_status = 3;
}
if ($order->status == 2) {
$order->order_status = 4;
}
if ($order->status == 3) {
$order->order_status = 5;
}
if ($order->status == -1) {
$order->order_status = 6;
}
if ($order->paid == 1 && $order->status == 0 && $order->order_type == 1) {
$order->order_status = 7;
}
return $order->order_status;
} }
public function userList($uid, $page, $limit) public function userList($uid, $page, $limit)
@ -1905,6 +1993,31 @@ class StoreOrderRepository extends BaseRepository
return $urlCode; return $urlCode;
} }
public function logisticsQrcode($orderId, $order_sn)
{
$siteUrl = systemConfig('site_url');
$name = md5('logi' . $orderId . date('Ymd')) . '.jpg';
$attachmentRepository = app()->make(AttachmentRepository::class);
$imageInfo = $attachmentRepository->getWhere(['attachment_name' => $name]);
if (isset($imageInfo['attachment_src']) && strstr($imageInfo['attachment_src'], 'http') !== false && curl_file_exist($imageInfo['attachment_src']) === false) {
$imageInfo->delete();
$imageInfo = null;
}
if (!$imageInfo) {
$imageInfo = app()->make(QrcodeService::class)->getQRCodePath($order_sn, $name);
if (is_string($imageInfo)) throw new ValidateException('二维码生成失败');
$imageInfo['dir'] = tidy_url($imageInfo['dir'], null, $siteUrl);
$attachmentRepository->create(systemConfig('upload_type') ?: 1, -2, $orderId, [
'attachment_category_id' => 99,
'attachment_name' => $imageInfo['name'],
'attachment_src' => $imageInfo['dir']
]);
$urlCode = $imageInfo['dir'];
} else $urlCode = $imageInfo['attachment_src'];
return $urlCode;
}
/** /**
* TODO 根据商品ID获取订单数 * TODO 根据商品ID获取订单数
* @param int $productId * @param int $productId
@ -2417,4 +2530,202 @@ class StoreOrderRepository extends BaseRepository
return true; return true;
} }
/**
* 订单结算
* @param $id
* @param $payType
* @param $user
* @return array
* @throws Exception
*/
public function settle($id, $payType, $user)
{
/** @var StoreGroupOrderRepository $groupOrderRepository */
$groupOrderRepository = app()->make(StoreGroupOrderRepository::class);
$groupOrderRepository->getAll = true;
Db::startTrans();
try {
$groupOrder = $groupOrderRepository->detail($user['uid'], $id, false);
if (!$groupOrder) {
throw new Exception('订单不存在或已支付');
}
$order = $groupOrder->orderList[0];
if (!$groupOrder->interest || $groupOrder->interest->status != StoreOrderInterest::STATUS_UNSETTLED || $order->status != 2) {
throw new Exception('订单无需结算');
}
$interest = $groupOrder->interest->calculateInterest();
$payMoney = bcadd($groupOrder->interest->total_price, $interest, 2);
$result = true;
$type = array_search($payType, StoreOrderRepository::PAY_TYPE);
if (in_array($payType, ['weixin', 'alipay'], true) && request()->isApp()) {
$payType .= 'App';
}
$data = ['type' => $type, 'order_id' => $groupOrder->group_order_id, 'paid' => true];
if ($payMoney > 0) {
$groupOrder->pay_price = $payMoney;
if (!in_array($payType, ['balance', 'scrcu'])) {
if (systemConfig('open_wx_combine')) {
$service = new CombinePayService($payType, $groupOrder->getCombinePayParams('order_settle'));
} else {
$service = new PayService($payType, $groupOrder->getPayParams($payType === 'alipay' ? request()->param('return_url') : '', 'order_settle'));
}
$result = $service->pay($user);
$data = array_merge($data, $result, ['paid' => false]);
} else {
$payTool = PayTool::instance($payType);
$result = $payTool->pay($groupOrder);
}
}
$groupOrder->interest->interest = $interest;
if ($result === true) {
//写入用户账单
/** @var UserBillRepository $userBillRepository */
$userBillRepository = app()->make(UserBillRepository::class);
$userBillRepository->decBill($user['uid'], 'now_money', 'pay_product', [
'link_id' => $groupOrder['group_order_id'],
'status' => 1,
'title' => '购买商品',
'number' => $groupOrder['pay_price'],
'mark' => '余额支付支付' . floatval($groupOrder['pay_price']) . '元购买商品',
'balance' => $user->now_money
]);
/** @var StoreOrderRepository $storeOrderRepo */
$storeOrderRepo = app()->make(StoreOrderRepository::class);
$storeOrderRepo->paySuccess($groupOrder);
app()->make(MerchantRepository::class)->computedLockMoney($groupOrder->orderList[0]);
$groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED;
$groupOrder->interest->settle_time = date('Y-m-d H:i:s');
//订单结算之后,修改订单支付方式为真实的支付方式
$groupOrder->pay_type = $type;
$groupOrder->save();
$order->pay_type = $type;
$order->save();
}
$groupOrder->interest->save();
Db::commit();
return $data;
} catch (\Exception $e) {
Db::rollback();
throw new Exception($e->getMessage());
}
}
/**
* 确认接单
* @param $user
* @param $id
* @param $type
* @return void
* @throws Exception
*/
public function confirm($id, $type)
{
/** @var StoreGroupOrderRepository $groupOrderRepository */
$groupOrderRepository = app()->make(StoreGroupOrderRepository::class);
$groupOrderRepository->getAll = true;
Db::startTrans();
try {
$groupOrder = $groupOrderRepository->get($id);
if ($groupOrder->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
throw new Exception('订单类型错误');
}
$order = $groupOrder->orderList[0];
if ($order->status != StoreOrder::STATUS_WAIT_CONFIRM) {
throw new Exception('订单状态错误');
}
if ($type == 2) {
$order->is_del = 1;
$groupOrder->is_del = 1;
if (!empty($order->interest) && $order->interest->status == StoreOrderInterest::STATUS_UNSETTLED) {
$order->interest->status = StoreOrderInterest::STATUS_DELETED;
$order->interest->save();
}
} else {
$order->status = StoreOrder::STATUS_WAIT_PAY;
$groupOrder->paid = 1;
$groupOrder->pay_time = date('Y-m-d H:i:s');
$order->paid = 1;
$order->pay_time = date('Y-m-d H:i:s');
}
$groupOrder->save();
$order->save();
Db::commit();
} catch (\Exception $e) {
Db::rollback();
throw new Exception($e->getMessage());
}
}
/**
* 采购订单列表
* @param $uid
* @param $keyword
* @param $page
* @param $limit
* @return array
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function purchaseOrder($where, $keyword, $page, $limit)
{
$orders = StoreOrder::where($where)
->where('activity_type', 98)
->whereIn('status', [StoreOrder::STATUS_WAIT_COMMENT, StoreOrder::STATUS_FINISH])
->where('is_system_del', 0)
->when($keyword !== '', function ($query) use ($keyword) {
$query->where('order_sn|user_phone', 'like', "%$keyword%");
})
->page($page, $limit)
->order('order_id', 'desc')
->select();
$return = [];
foreach ($orders as $order) {
$products = $order->orderProduct;
$currentOrder = $order->toArray();
foreach ($products as $k => $product) {
$purchaseRecord = PurchaseRecord::where(['order_id' => $product['order_id'], 'order_product_id' => $product['product_id'], 'order_unique' => $product['product_sku']])->field('id,number,sales_volume')->find();
if (!empty($purchaseRecord)) {
$currentOrder['orderProduct'][$k]['sales_volume'] = $purchaseRecord->sales_volume;
$currentOrder['orderProduct'][$k]['purchase_record'] = $purchaseRecord->toArray();
} else {
$currentOrder['orderProduct'][$k]['sales_volume'] = 0;
$currentOrder['orderProduct'][$k]['purchase_record'] = [];
}
}
$return[] = $currentOrder;
}
return $return;
}
/**
* @param $orderId
* @param $orderSn
* 更新扫描发货状态
*/
public function deliveryGoods($orderId, $orderSn, $logisticsCode='')
{
if ($logisticsCode) {
$order = $this->dao->search([], null)->where('order_sn', $orderSn)->where('order_id', $orderId)->where('logistics_code', $logisticsCode)->where('StoreOrder.status', 1)->where('StoreOrder.is_del', 0)->find();
} else {
$order = $this->dao->search([], null)->where('order_sn', $orderSn)->where('order_id', $orderId)->where('StoreOrder.status', 0)->where('StoreOrder.is_del', 0)->find();
}
if (!$order)
throw new ValidateException('订单不存在或编码code错误');
if ($order['order_type'])
throw new ValidateException('订单类型错误');
if ($logisticsCode) {
$order->status = 2;
$order->mark = '快递员已完成送货';
} else {
$order->status = 1;
$order->mark = '快递员已扫描取件';
event('product.delivery', compact('order'));
}
$order->save();
}
} }

View File

@ -444,7 +444,7 @@ class StoreOrderRepository extends BaseRepository
try { try {
$this->batchPrinter($orderId, $merId); $this->batchPrinter($orderId, $merId);
} catch (Exception $exception) { } catch (Exception $exception) {
Log::info('自动打印小票报错' . $exception); Log::info('自动打印小票报错');
} }
} else { } else {
Log::info('自动打印小票验证商户ID【' . $merId . '】,自动打印状态未开启'); Log::info('自动打印小票验证商户ID【' . $merId . '】,自动打印状态未开启');

View File

@ -15,6 +15,7 @@ namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreRefundOrderDao; use app\common\dao\store\order\StoreRefundOrderDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder; use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreRefundOrder; use app\common\model\store\order\StoreRefundOrder;
use app\common\model\system\merchant\FinancialRecord; use app\common\model\system\merchant\FinancialRecord;
@ -268,6 +269,9 @@ class StoreRefundOrderRepository extends BaseRepository
*/ */
public function refunds(StoreOrder $order, array $ids, $uid, array $data) public function refunds(StoreOrder $order, array $ids, $uid, array $data)
{ {
if ($order->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $order->status == 2) {
throw new ValidateException('已收货的订单不支持退款');
}
$orderId = $order->order_id; $orderId = $order->order_id;
$products = app()->make(StoreOrderProductRepository::class)->userRefundProducts($ids, $uid, $orderId); $products = app()->make(StoreOrderProductRepository::class)->userRefundProducts($ids, $uid, $orderId);
if (!$products || count($ids) != count($products)) if (!$products || count($ids) != count($products))
@ -331,6 +335,9 @@ class StoreRefundOrderRepository extends BaseRepository
$data['integral'] = $totalIntegral; $data['integral'] = $totalIntegral;
$data['platform_refund_price'] = $totalPlatformRefundPrice; $data['platform_refund_price'] = $totalPlatformRefundPrice;
$data['refund_postage'] = $totalPostage; $data['refund_postage'] = $totalPostage;
if ($order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
$data['refund_price'] = 0;
}
return Db::transaction(function () use ($refundProduct, $data, $products, $order, &$refund_order_id) { return Db::transaction(function () use ($refundProduct, $data, $products, $order, &$refund_order_id) {
event('refund.creates.before', compact('data')); event('refund.creates.before', compact('data'));
@ -394,6 +401,9 @@ class StoreRefundOrderRepository extends BaseRepository
*/ */
public function refund(StoreOrder $order, $productId, $num, $uid, array $data) public function refund(StoreOrder $order, $productId, $num, $uid, array $data)
{ {
if ($order->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $order->status == 2) {
throw new ValidateException('已收货的订单不支持退款');
}
$orderId = $order->order_id; $orderId = $order->order_id;
//TODO 订单状态生成佣金 //TODO 订单状态生成佣金
$product = app()->make(StoreOrderProductRepository::class)->userRefundProducts([$productId], $uid, $orderId); $product = app()->make(StoreOrderProductRepository::class)->userRefundProducts([$productId], $uid, $orderId);
@ -464,6 +474,9 @@ class StoreRefundOrderRepository extends BaseRepository
$data['refund_num'] = $num; $data['refund_num'] = $num;
$data['extension_one'] = $total_extension_one; $data['extension_one'] = $total_extension_one;
$data['extension_two'] = $total_extension_two; $data['extension_two'] = $total_extension_two;
if ($order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
$data['refund_price'] = 0;
}
return Db::transaction(function () use ($order, $data, $product, $productId, $num) { return Db::transaction(function () use ($order, $data, $product, $productId, $num) {
event('refund.create.before', compact('data')); event('refund.create.before', compact('data'));
@ -871,6 +884,8 @@ class StoreRefundOrderRepository extends BaseRepository
} else { } else {
$storeOrderStatusRepository->createAdminLog($orderStatus); $storeOrderStatusRepository->createAdminLog($orderStatus);
} }
// 通知物流退货
event('refund.deliver', compact('id', 'refund'));
event('refund.agree', compact('id', 'refund')); event('refund.agree', compact('id', 'refund'));
}); });
} }

View File

@ -13,14 +13,21 @@
namespace app\common\repositories\store\product; namespace app\common\repositories\store\product;
use app\common\dao\store\order\StoreCartDao;
use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderProduct;
use app\common\model\store\product\ProductAttrValue;
use app\common\model\store\product\ProductLabel; use app\common\model\store\product\ProductLabel;
use app\common\model\store\product\PurchaseRecord;
use app\common\model\store\product\Spu; use app\common\model\store\product\Spu;
use app\common\model\store\Resale;
use app\common\model\user\User; use app\common\model\user\User;
use app\common\repositories\community\CommunityRepository; use app\common\repositories\community\CommunityRepository;
use app\common\repositories\store\coupon\StoreCouponRepository; use app\common\repositories\store\coupon\StoreCouponRepository;
use app\common\repositories\store\GuaranteeRepository; use app\common\repositories\store\GuaranteeRepository;
use app\common\repositories\store\GuaranteeTemplateRepository; use app\common\repositories\store\GuaranteeTemplateRepository;
use app\common\repositories\store\GuaranteeValueRepository; use app\common\repositories\store\GuaranteeValueRepository;
use app\common\repositories\store\order\PurchaseRecordRepository;
use app\common\repositories\store\order\StoreCartRepository; use app\common\repositories\store\order\StoreCartRepository;
use app\common\repositories\store\order\StoreOrderProductRepository; use app\common\repositories\store\order\StoreOrderProductRepository;
use app\common\repositories\store\order\StoreOrderRepository; use app\common\repositories\store\order\StoreOrderRepository;
@ -38,6 +45,7 @@ use crmeb\services\QrcodeService;
use crmeb\services\RedisCacheService; use crmeb\services\RedisCacheService;
use crmeb\services\SwooleTaskService; use crmeb\services\SwooleTaskService;
use FormBuilder\Factory\Elm; use FormBuilder\Factory\Elm;
use think\db\exception\DataNotFoundException;
use think\exception\ValidateException; use think\exception\ValidateException;
use think\facade\Cache; use think\facade\Cache;
use think\facade\Db; use think\facade\Db;
@ -61,7 +69,7 @@ class ProductRepository extends BaseRepository
protected $dao; protected $dao;
const CREATE_PARAMS = [ const CREATE_PARAMS = [
"image", "slider_image", "store_name", "store_info", "keyword", "bar_code", "guarantee_template_id", "cate_id", "mer_cate_id", "unit_name", "sort" , "is_show", "is_good", 'is_gift_bag', 'integral_rate', "video_link", "temp_id", "content", "spec_type", "extension_type", "attr", 'mer_labels', 'delivery_way', 'delivery_free','param_temp_id','extend', "image", "slider_image", "store_name", "store_info", "keyword", "bar_code", "guarantee_template_id", "cate_id", "mer_cate_id", "unit_name", "sort" , "is_show", "is_good", 'is_gift_bag', 'integral_rate', "video_link", "temp_id", "content", "spec_type", "extension_type", "attr", 'mer_labels', 'delivery_way', 'delivery_free','param_temp_id','extend', 'source_product_id',
["brand_id",0], ["brand_id",0],
['once_max_count',0], ['once_max_count',0],
['once_min_count',0], ['once_min_count',0],
@ -73,8 +81,8 @@ class ProductRepository extends BaseRepository
['svip_price_type',0], ['svip_price_type',0],
['params',[]], ['params',[]],
]; ];
protected $admin_filed = 'Product.product_id,Product.mer_id,brand_id,spec_type,unit_name,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,U.rank,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,star,ficti,integral_total,integral_price_total,sys_labels,param_temp_id,mer_svip_status,svip_price,svip_price_type,update_time'; protected $admin_filed = 'Product.product_id,Product.mer_id,brand_id,spec_type,unit_name,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,U.rank,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,star,ficti,integral_total,integral_price_total,sys_labels,param_temp_id,mer_svip_status,svip_price,svip_price_type,update_time,source_product_id';
protected $filed = 'Product.bar_code,Product.product_id,Product.mer_id,brand_id,unit_name,spec_type,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,integral_total,integral_price_total,mer_labels,Product.is_good,Product.is_del,type,param_temp_id,mer_svip_status,svip_price,svip_price_type,update_time'; protected $filed = 'Product.bar_code,Product.product_id,Product.mer_id,brand_id,unit_name,spec_type,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,integral_total,integral_price_total,mer_labels,Product.is_good,Product.is_del,type,param_temp_id,mer_svip_status,svip_price,svip_price_type,update_time,source_product_id';
const NOTIC_MSG = [ const NOTIC_MSG = [
1 => [ 1 => [
@ -477,6 +485,7 @@ class ProductRepository extends BaseRepository
'once_max_count' => $data['once_max_count'] ?? 0, 'once_max_count' => $data['once_max_count'] ?? 0,
'pay_limit' => $data['pay_limit'] ?? 0, 'pay_limit' => $data['pay_limit'] ?? 0,
'svip_price_type' => $data['svip_price_type'] ?? 0, 'svip_price_type' => $data['svip_price_type'] ?? 0,
'source_product_id' => $data['source_product_id'] ?? 0,
]; ];
$result['bar_code'] = $data['attrValue'][0]['bar_code'] ?? ''; $result['bar_code'] = $data['attrValue'][0]['bar_code'] ?? '';
if (isset($data['mer_id'])) if (isset($data['mer_id']))
@ -866,7 +875,7 @@ class ProductRepository extends BaseRepository
*/ */
public function getList(?int $merId, array $where, int $page, int $limit) public function getList(?int $merId, array $where, int $page, int $limit)
{ {
$query = $this->dao->search($merId, $where)->with(['merCateId.category', 'storeCategory', 'brand']); $query = $this->dao->search($merId, $where)->with(['merCateId.category', 'storeCategory', 'brand', 'attrValue']);
$count = $query->count(); $count = $query->count();
$data = $query->page($page, $limit)->setOption('field', [])->field($this->filed)->select(); $data = $query->page($page, $limit)->setOption('field', [])->field($this->filed)->select();
@ -1605,14 +1614,14 @@ class ProductRepository extends BaseRepository
Db::startTrans(); Db::startTrans();
try { try {
if ($this->dao->updates($id,[$field => $status]) === false) { if ($this->dao->updates($id,[$field => $status]) === false) {
throw new \Exception('商品操作出错'); throw new \Exception('商品操作出错', 500);
} }
event('product.sell', ['product_id' => $productIds]); event('product.sell', ['product_id' => $productIds]);
Db::commit(); Db::commit();
Queue::push(ChangeSpuStatusJob::class,['id' => $id,'product_type'=> $product_type]); Queue::push(ChangeSpuStatusJob::class,['id' => $id,'product_type'=> $product_type]);
} catch (\Exception $e) { } catch (\Exception $e) {
Db::rollback(); Db::rollback();
throw new ValidateException($e->getMessage()); throw new \Exception('商品操作出错', $e->getCode());
} }
} }
@ -1753,6 +1762,7 @@ class ProductRepository extends BaseRepository
{ {
$productNum = $productNum ?? $cart['product_num']; $productNum = $productNum ?? $cart['product_num'];
Db::transaction(function () use ($order, $cart, $productNum) { Db::transaction(function () use ($order, $cart, $productNum) {
/** @var ProductAttrValueRepository $productAttrValueRepository */
$productAttrValueRepository = app()->make(ProductAttrValueRepository::class); $productAttrValueRepository = app()->make(ProductAttrValueRepository::class);
if ($cart['product_type'] == '1') { if ($cart['product_type'] == '1') {
$oldId = $cart['cart_info']['product']['old_product_id']; $oldId = $cart['cart_info']['product']['old_product_id'];
@ -1777,8 +1787,19 @@ class ProductRepository extends BaseRepository
$productAttrValueRepository->incSkuStock($oldId, $cart['cart_info']['productAttr']['sku'], $productNum); $productAttrValueRepository->incSkuStock($oldId, $cart['cart_info']['productAttr']['sku'], $productNum);
$this->dao->incStock($oldId, $productNum); $this->dao->incStock($oldId, $productNum);
} else { } else {
$productAttrValueRepository->incStock($cart['product_id'], $cart['cart_info']['productAttr']['unique'], $productNum); if ($cart['source'] == StoreCartDao::SOURCE_COMMUNITY_RESALE) {
$this->dao->incStock($cart['product_id'], $productNum); /** @var CommunityRepository $communityRepository */
$communityRepository = app()->make(CommunityRepository::class);
$communityRepository->saleOrCancel($cart['source_id'], 0);
$productAttrValueRepository->descSales($cart['product_id'], $cart['cart_info']['productAttr']['unique'], $productNum);
$this->dao->descSales($cart['product_id'], $productNum);
} else {
$productAttrValueRepository->incStock($cart['product_id'], $cart['cart_info']['productAttr']['unique'], $productNum);
$this->dao->incStock($cart['product_id'], $productNum);
}
/** @var PurchaseRecordRepository $purchaseRecordRepo */
$purchaseRecordRepo = app()->make(PurchaseRecordRepository::class);
$purchaseRecordRepo->descSalesVolume($cart['product_id'], $cart['cart_info']['productAttr']['unique'], $productNum);
} }
if ($cart->integral > 0) { if ($cart->integral > 0) {
$totalIntegral = bcmul($productNum, $cart->integral, 0); $totalIntegral = bcmul($productNum, $cart->integral, 0);
@ -2243,6 +2264,9 @@ class ProductRepository extends BaseRepository
]; ];
} }
} }
foreach ($data['attrValue'] as $k => $item) {
$data['attrValue'][$k]['stock'] = 0;
}
app()->make(ProductLabelRepository::class)->checkHas($merId,$data['mer_labels']); app()->make(ProductLabelRepository::class)->checkHas($merId,$data['mer_labels']);
$count = app()->make(StoreCategoryRepository::class)->getWhereCount(['store_category_id' => $data['cate_id'],'is_show' => 1]); $count = app()->make(StoreCategoryRepository::class)->getWhereCount(['store_category_id' => $data['cate_id'],'is_show' => 1]);
if (!$count) throw new ValidateException('平台分类不存在或不可用'); if (!$count) throw new ValidateException('平台分类不存在或不可用');
@ -2252,4 +2276,194 @@ class ProductRepository extends BaseRepository
//单次限购 //单次限购
return $data; return $data;
} }
/**
* 采购入库
* @param $merId
* @param $params
* @return true
* @throws \Exception
*/
public function stockIn($merId, $params)
{
Db::startTrans();
try {
$supplierMerId = 0;
if (empty($params['product_id']) && !empty($params['order_product_id'])) {
//有商品无规格或者无商品无规格,导入商品和规格
$product = $this->getWhere(['source_product_id' => $params['order_product_id'], 'mer_id' => $merId]);
if (!empty($product)) {
$unique = $this->importAttrValue($params['order_product_id'], $product->toArray(), $params['order_unique']);
if (!$unique) {
throw new \Exception('商品规格导入出错', 500);
}
} else {
$productId = $this->import($params['order_product_id'], request()->userInfo());
$product = $this->get($productId);
}
$sku = ProductAttrValue::where('product_id', $params['order_product_id'])->where('unique', $params['order_unique'])->value('sku');
$attrValue = ProductAttrValue::where('mer_id', $merId)->where('product_id', $product['product_id'])->where('sku', $sku)->find();
} else {
//有商品有规格
$product = $this->get($params['product_id']);
$attrValue = ProductAttrValue::where('mer_id', $merId)->where('product_id', $params['product_id'])->where('unique', $params['unique'])->find();
}
if (!$product || !$attrValue) {
throw new DataNotFoundException('商品或规格不存在');
}
$stockIn = $params['number'] ?? 0;
$price = $params['price'] ?? 0;
if (!empty($params['order_id'])) {
//采购订单导入
$orderMerId = StoreOrder::where('order_id', $params['order_id'])->value('mer_id');
$orderProduct = StoreOrderProduct::where('order_id', $params['order_id'])->where('product_id', $params['order_product_id'])->where('product_sku', $params['order_unique'])->find();
if (empty($orderProduct) || $orderProduct->is_imported == 1) {
throw new ValidateException('订单商品不存在或已入库');
}
$stockIn = $orderProduct['product_num'] ?? 0;
$price = $orderProduct['product_price'] ?? 0;
$supplierMerId = $orderMerId ?? 0;
}
if ($stockIn <= 0) {
throw new ValidateException('入库数量不能小于等于0');
}
$attrValue->stock = $attrValue->stock + $stockIn;
$attrValue->save();
$product->stock = $stockIn + $product->stock;
if (!$product->save()) {
throw new \Exception('商品库存保存失败', 500);
}
$model = new PurchaseRecord();
$data = [
'order_id' => $params['order_id'] ?? 0,
'order_product_id' => $params['order_product_id'] ?? 0,
'product_id' => $product->product_id,
'number' => $stockIn,
'order_unique' => $params['order_unique'] ?? '',
'unique' => $attrValue['unique'],
'price' => $price,
'mer_id' => $product->mer_id,
'supplier_mer_id' => $supplierMerId,
];
if (!$model->save($data)) {
throw new \Exception('入库失败', 500);
}
if (isset($orderProduct) && !$orderProduct->save(['is_imported' => 1])) {
throw new \Exception('订单商品更新出错', 500);
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
throw new \Exception($e->getMessage(), $e->getCode());
}
return true;
}
/**
* 导入商品
* @param $product_id
* @param $user
* @return bool
* @throws \Exception
*/
public function import($product_id, $user)
{
$mer_id = Db::name('store_service')->where('uid', $user['uid'])->where('status', 1)->value('mer_id');
if ($mer_id == 0) {
throw new DataNotFoundException('商户不存在');
}
$find = Db::name('store_product')->where('product_id', $product_id)->find();
if ($find) {
if (!in_array($find['product_type'], [0, 98])) {
throw new ValidateException('该商品不是普通商品');
}
$exist = Db::name('store_product')->where('source_product_id', $product_id)->where('mer_id', $mer_id)->find();
if ($exist) {
throw new ValidateException('已经导入过该商品了');
}
$attr = Db::name('store_product_attr')->where('product_id', $find['product_id'])->field('attr_name,attr_values,type')->select();
foreach ($attr as $item) {
$find['attr'][] = ['attr_name' => $item['attr_name'], 'detail' => explode('-!-', $item['attr_values'])];
}
$find['attrValue'] = Db::name('store_product_attr_value')->where(['product_id' => $find['product_id']])->field('image,price,cost,ot_price,svip_price,0 as stock,bar_code,weight,volume,detail')->select()->each(function ($item) {
$item['detail'] = empty($item['detail']) ? [] : json_decode($item['detail'], true);
return $item;
})->toArray();
$find['content'] = Db::name('store_product_content')->where('product_id', $find['product_id'])->value('content');
$find['is_show'] = 0;
$find['mer_id'] = $mer_id;
$find['temp_id'] = "";
$find['give_coupon_ids'] = [];
$find['params'] = [];
$find['extend'] = [];
$find['param_temp_id'] = [];
$find['mer_labels'] = [];
$find['delivery_way'] = [0 => "2"];
$find["guarantee_template_id"] = "";
$find['product_type'] = 0;
$find['mer_cate_id'] = [0 => 0];
$find['is_used'] = 1;
$find['status'] = 1;
$find['mer_status'] = 1;
$find['source_product_id'] = $product_id;
$find['slider_image'] = explode(',', $find['slider_image']);
unset($find['product_id'], $find['create_time']);
}
return $this->create($find, 0);
}
/**
* 仅导入规格值
* @param $oldProductId
* @param $product
* @param $unique
* @return bool
*/
public function importAttrValue($oldProductId, $product, $unique)
{
$product['attrValue'] = ProductAttrValue::where(['product_id' => $oldProductId])->field('image,price,cost,ot_price,svip_price,0 as stock,bar_code,weight,volume,detail')->select();
$settleParams = $this->setAttrValue($product, $product['product_id'], 0, 0, $product['mer_id']);
if (!empty($settleParams['attrValue'])) {
foreach ($settleParams['attrValue'] as $item) {
if (!ProductAttrValue::getInstance()->insert($item)) {
throw new ValidateException('商品规格保存出错');
}
}
return true;
}
return false;
}
/**
* 可转售商品列表
* @param
* @param
* @param
* @return array
*/
public function communityProduct($where, $keyword, $page, $limit)
{
$merId = Db::name('store_service')->where('uid', $where['uid'])->where('status', 1)->value('mer_id', 0);
unset($where['uid']);
$where['status'] = 1;
$where['is_show'] = 1;
if (!empty($keyword)) {
$where['keyword'] = $keyword;
}
$query = $this->dao->search($merId, $where)->with(['merCateId.category', 'storeCategory', 'brand', 'attrValue']);
$count = $query->count();
$data = $query->page($page, $limit)->setOption('field', [])->field($this->filed)->select();
$data->append(['us_status']);
$list = hasMany(
$data ,
'mer_labels',
ProductLabel::class,
'product_label_id',
'mer_labels',
['status' => 1],
'product_label_id,product_label_id id,label_name name'
);
return compact('count', 'list');
}
} }

View File

@ -150,6 +150,7 @@ class SpuRepository extends BaseRepository
$query->field($this->merchantFiled)->with(['type_name']); $query->field($this->merchantFiled)->with(['type_name']);
}, },
'issetCoupon', 'issetCoupon',
'product.attrValue',
]); ]);
$productMake = app()->make(ProductRepository::class); $productMake = app()->make(ProductRepository::class);
$count = $query->count(); $count = $query->count();

View File

@ -35,6 +35,8 @@ class RelevanceRepository extends BaseRepository
const TYPE_COMMUNITY_REPLY_START = 'community_reply_start'; const TYPE_COMMUNITY_REPLY_START = 'community_reply_start';
//商户权限 //商户权限
const TYPE_MERCHANT_AUTH = 'mer_auth'; const TYPE_MERCHANT_AUTH = 'mer_auth';
//转售商品
const TYPE_COMMUNITY_RESALE = 'community_resale'; //转售贴关联
//指定范围类型 //指定范围类型
//0全部商品 //0全部商品

View File

@ -465,6 +465,7 @@ class FinancialRecordRepository extends BaseRepository
$date = ($type == 1) ? date('Y-m-d', $date_) : date('Y-m', $date_); $date = ($type == 1) ? date('Y-m-d', $date_) : date('Y-m', $date_);
$income = $this->countIncome($type, $where, $date,$merchant); $income = $this->countIncome($type, $where, $date,$merchant);
$expend = $this->countExpend($type, $where, $date,$merchant); $expend = $this->countExpend($type, $where, $date,$merchant);
$data['e'] = $expend;
$charge = bcsub($income['number'], $expend['number'], 2); $charge = bcsub($income['number'], $expend['number'], 2);
$data['date'] = $date; $data['date'] = $date;
@ -634,7 +635,7 @@ class FinancialRecordRepository extends BaseRepository
$financialType = ['brokerage_one', 'brokerage_two']; $financialType = ['brokerage_one', 'brokerage_two'];
[$data['count_brokerage'], $data['number_brokerage']] = $this->dao->getDataByType($type, $where, $date, $financialType); [$data['count_brokerage'], $data['number_brokerage']] = $this->dao->getDataByType($type, $where, $date, $financialType);
// 退回 手续费 // 退回手续费
$financialType = ['refund_charge']; $financialType = ['refund_charge'];
[$data['count_charge'], $data['number_charge']] = $this->dao->getDataByType($type, $where, $date, $financialType); [$data['count_charge'], $data['number_charge']] = $this->dao->getDataByType($type, $where, $date, $financialType);
@ -665,7 +666,7 @@ class FinancialRecordRepository extends BaseRepository
$commission=['commission_to_town','commission_to_village','commission_to_service_team','commission_to_cloud_warehouse','commission_to_entry_merchant']; $commission=['commission_to_town','commission_to_village','commission_to_service_team','commission_to_cloud_warehouse','commission_to_entry_merchant'];
} }
if ($where['is_mer']) { //商户的 if ($where['is_mer']) { //商户的
//退回 收入 //退回收入
$financialType = ['refund_order']; $financialType = ['refund_order'];
[$data['count_refund'], $data['number_refund']] = $this->dao->getDataByType($type, $where, $date, $financialType); [$data['count_refund'], $data['number_refund']] = $this->dao->getDataByType($type, $where, $date, $financialType);

View File

@ -16,7 +16,9 @@ namespace app\common\repositories\system\merchant;
use app\common\dao\system\merchant\MerchantDao; use app\common\dao\system\merchant\MerchantDao;
use app\common\dao\system\serve\ServeOrderDao; use app\common\dao\system\serve\ServeOrderDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder; use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderInterest;
use app\common\model\store\product\ProductReply; use app\common\model\store\product\ProductReply;
use app\common\model\store\service\StoreService; use app\common\model\store\service\StoreService;
use app\common\model\system\merchant\Merchant; use app\common\model\system\merchant\Merchant;
@ -289,7 +291,7 @@ class MerchantRepository extends BaseRepository
*/ */
public function getList($where, $page, $limit, $userInfo) public function getList($where, $page, $limit, $userInfo)
{ {
$field = 'care_count,is_trader,type_id,mer_id,mer_banner,mini_banner,mer_name, mark,mer_avatar,product_score,service_score,postage_score,sales,status,is_best,create_time,long,lat,is_margin,service_phone,mer_address,mer_info'; $field = 'care_count,is_trader,type_id,mer_id,mer_banner,mini_banner,mer_name, mark,mer_avatar,product_score,service_score,postage_score,sales,status,is_best,create_time,long,lat,is_margin,service_phone,mer_address,mer_info,credit_buy,settle_cycle,interest_rate';
$where['status'] = 1; $where['status'] = 1;
$where['mer_state'] = 1; $where['mer_state'] = 1;
$where['is_del'] = 0; $where['is_del'] = 0;
@ -500,7 +502,8 @@ class MerchantRepository extends BaseRepository
public function addLockMoney(int $merId, string $orderType, int $orderId, float $money) public function addLockMoney(int $merId, string $orderType, int $orderId, float $money)
{ {
if ($money <= 0) return; if ($money <= 0) return;
if (systemConfig('mer_lock_time')) { $payType = StoreOrder::getInstance()->where('order_id', $orderId)->value('pay_type');
if (systemConfig('mer_lock_time') || $payType == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
app()->make(UserBillRepository::class)->incBill($merId, 'mer_lock_money', $orderType, [ app()->make(UserBillRepository::class)->incBill($merId, 'mer_lock_money', $orderType, [
'link_id' => ($orderType === 'order' ? 1 : 2) . $orderId, 'link_id' => ($orderType === 'order' ? 1 : 2) . $orderId,
'mer_id' => $merId, 'mer_id' => $merId,
@ -729,17 +732,16 @@ class MerchantRepository extends BaseRepository
$values['order_sn'] = app()->make(StoreOrderRepository::class)->getNewOrderId('cs'); $values['order_sn'] = app()->make(StoreOrderRepository::class)->getNewOrderId('cs');
$values['pay_time'] = date('y_m-d H:i:s', time()); $values['pay_time'] = date('y_m-d H:i:s', time());
if (!app()->make(ServeOrderDao::class)->create($values)) { if (!app()->make(ServeOrderDao::class)->create($values)) {
throw new \Exception('serve_order 保存出错'); throw new \Exception('serve_order 保存出错', 500);
} }
$merchant->paid_margin = bcadd($margin, $merchant->paid_margin, 2); $merchant->paid_margin = bcadd($margin, $merchant->paid_margin, 2);
$merchant->ot_margin = $merchant->paid_margin; $merchant->ot_margin = $merchant->paid_margin;
$merchant->is_margin = MerchantRepository::PaidMargin; $merchant->is_margin = MerchantRepository::PaidMargin;
if ($merchant->save() === false) { if ($merchant->save() === false) {
throw new \Exception('merchant 保存出错'); throw new \Exception('merchant 保存出错', 500);
} }
return [$income, $finance, true]; return [$income, $finance, true];
} }
} }

View File

@ -52,6 +52,17 @@ class UserAddressRepository extends BaseRepository
return $this->dao->userFieldExists($this->dao->getPk(),$id,$uid); return $this->dao->userFieldExists($this->dao->getPk(),$id,$uid);
} }
/**
* @param int $id
* @param int $uid
* @return bool
* @author Qinii
*/
public function villageExists($field, $value)
{
return $this->dao->villageExists($field, $value);
}
/** /**
* @param int $uid * @param int $uid
* @return bool * @return bool
@ -115,6 +126,6 @@ class UserAddressRepository extends BaseRepository
*/ */
public function get($id,$uid) public function get($id,$uid)
{ {
return $this->dao->getWhere(['address_id' => $id,'uid' => $uid])->append(['area']); return $this->dao->getWhere(['address_id' => $id,'uid' => $uid]);
} }
} }

View File

@ -106,7 +106,7 @@ class UserRelationRepository extends BaseRepository
]; ];
if($where['type'] == 10) $with = [ if($where['type'] == 10) $with = [
'merchant' => function($query){ 'merchant' => function($query){
$query->where('status',1)->where('mer_state',1)->where('is_del',0)->field('mer_id,type_id,mer_name,mer_avatar,sales,mer_info,care_count,status,is_del,mer_state'); $query->field('mer_id,type_id,mer_name,mer_avatar,sales,mer_info,care_count,status,is_del,mer_state');
} }
]; ];
$query = $this->dao->search($where); $query = $this->dao->search($where);
@ -181,15 +181,11 @@ class UserRelationRepository extends BaseRepository
{ {
if ($type == 10) { if ($type == 10) {
app()->make(MerchantRepository::class)->decCareCount($ids); app()->make(MerchantRepository::class)->decCareCount($ids);
$type_id = $ids;
} else { } else {
foreach ($ids as $id) {
$spu = $this->getSpu(['type_id' => $id, 'type' => $type]);
$type_id[] = $spu->spu_id;
}
$type = 1; $type = 1;
app()->make(ProductRepository::class)->decCareCount($ids); app()->make(ProductRepository::class)->decCareCount($ids);
} }
$type_id = $ids;
return $this->dao->search(['uid' => $uid,'type' => $type])->where('type_id','in',$type_id)->delete(); return $this->dao->search(['uid' => $uid,'type' => $type])->where('type_id','in',$type_id)->delete();
} }

View File

@ -0,0 +1,253 @@
<?php
namespace app\common\service;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\system\merchant\Merchant;
use app\common\model\user\User;
use app\common\repositories\store\order\StoreGroupOrderRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use JPush\Client;
use think\facade\Log;
class JgPush
{
public $client;
public $push;
public function __construct()
{
$this->client = new Client('b5f679f4357018605ea6fd2e', 'c4fb573758f8d7058d697c54');
$this->push = $this->client->push();
$this->setPlatform();
}
public function send($type, $data)
{
switch ($type) {
case 'ADMIN_PAY_SUCCESS_CODE':
$groupOrder = app()->make(StoreGroupOrderRepository::class)->get($data['id']);
if ($groupOrder) {
foreach ($groupOrder->orderList as $order) {
$this->client = new Client('b5f679f4357018605ea6fd2e', 'c4fb573758f8d7058d697c54');
$this->push = $this->client->push();
$this->setPlatform();
$route = "/pages/admin/orderDetail/index?id={$order['order_id']}&mer_id={$order['mer_id']}";
$merUserId = Merchant::where('mer_id', $order->mer_id)->value('uid');
$jgRegisterId = User::where('uid', $merUserId)->value('jg_register_id');
if (empty($jgRegisterId)) {
continue;
}
$msg = $order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY ? '您有新的订单已结算,请注意查看。' : '您有新的订单,请注意查看。';
$msgType = $order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY ? 'ORDER_SETTLEMENT' : 'ORDER_CREATE';
$this->addRegistrationId($jgRegisterId);
$this->androidNotification($msg, ['extras' => ['route' => $route, 'type' => $msgType]]);
$this->iosNotification($msg, ['extras' => ['route' => $route, 'type' => $msgType]]);
$this->push->send();
unset($this->client, $this->push);
}
}
break;
case 'DELIVER_GOODS_CODE':
case 'ORDER_DELIVER_SUCCESS':
$order = app()->make(StoreOrderRepository::class)->get($data['id']);
if ($order) {
$route = "/pages/order_details/index?order_id={$order['order_id']}";
$jgRegisterId = User::where('uid', $order['uid'])->value('jg_register_id');
if (!empty($jgRegisterId)) {
$this->addRegistrationId($jgRegisterId);
$this->androidNotification('您的订单已发货,请注意查看。', ['extras' => ['route' => $route]]);
$this->iosNotification('您的订单已发货,请注意查看。', ['extras' => ['route' => $route]]);
$this->push->send();
}
}
break;
case 'MERCHANT_CREDIT_BUY_NOTICE':
$route = "/pages/order_details/stay?order_id={$data['orderId']}&product_type=98";
$merUserId = Merchant::where('mer_id', $data['id'])->value('uid');
$jgRegisterId = User::where('uid', $merUserId)->value('jg_register_id');
if (empty($jgRegisterId)) {
break;
}
$this->addRegistrationId($jgRegisterId);
$this->androidNotification('您的先货后款订单即将逾期,请尽快处理!', ['extras' => ['route' => $route]]);
$this->iosNotification('您的先货后款订单即将逾期,请尽快处理!', ['extras' => ['route' => $route]]);
$this->push->send();
break;
case 'ORDER_CREATE':
$order = app()->make(StoreOrderRepository::class)->get($data['id']);
if ($order->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
break;
}
$route = "/pages/admin/orderDetail/index?id={$order['order_id']}&mer_id={$order['mer_id']}";
$merUserId = Merchant::where('mer_id', $order['mer_id'])->value('uid');
$jgRegisterId = User::where('uid', $merUserId)->value('jg_register_id');
if (empty($jgRegisterId)) {
break;
}
$this->addRegistrationId($jgRegisterId);
$this->androidNotification('您有新的订单,请注意查看。', ['extras' => ['route' => $route, 'type' =>'ORDER_CREATE']]);
$this->iosNotification('您有新的订单,请注意查看。', ['extras' => ['route' => $route, 'type' =>'ORDER_CREATE']]);
$this->push->send();
break;
case 'ORDER_PAY_SUCCESS':
$order = app()->make(StoreOrderRepository::class)->get($data['id']);
if ($order->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
break;
}
$route = "/pages/admin/orderDetail/index?id={$order['order_id']}&mer_id={$order['mer_id']}";
$merUserId = Merchant::where('mer_id', $order['mer_id'])->value('uid');
$jgRegisterId = User::where('uid', $merUserId)->value('jg_register_id');
if (empty($jgRegisterId)) {
break;
}
$this->addRegistrationId($jgRegisterId);
$this->androidNotification('您有新的订单,请注意查看。', ['extras' => ['route' => $route, 'type' =>'ORDER_PAY_SUCCESS']]);
$this->iosNotification('您有新的订单,请注意查看。', ['extras' => ['route' => $route, 'type' =>'ORDER_PAY_SUCCESS']]);
$this->push->send();
break;
default:
break;
}
}
/**
* 设置推送平台
* @param array $platform
*/
public function setPlatform(array $platform = ['android', 'ios'])
{
$this->push->setPlatform($platform);
}
/**
* 设置推送设备
* @param $registrationId
* @return void
*/
public function addRegistrationId($registrationId)
{
$this->push->addRegistrationId($registrationId);
}
/**
* 给所有平台推送相同的 alert 消息
* @param $alert
* @return void
*/
public function setNotificationAlert($alert)
{
$this->push->setNotificationAlert($alert);
}
/**
* ios平台通知
* @param $alert
* @param $extras
* @return void
* @example $extras = ['sound' => 'sound', 'badge' => '+1', 'extras' => ['key' => 'value']
*/
public function iosNotification($alert, $extras = [])
{
$this->push->iosNotification($alert, $extras);
}
/**
* android平台通知
* @param $alert
* @param $extras
* @return void
* @example $extras = ['alert' => 'alert', 'title' => 'title', 'extras' => ['key' => 'value']
*/
public function androidNotification($alert, $extras = [])
{
$this->push->androidNotification($alert, $extras);
}
/**
* iOS VOIP 功能
* @param $extras
* @return void
* @example $extras = ['key' => 'value'] //任意自定义 key/value 对,会透传给 APP
*/
public function voip($extras = [])
{
$this->push->voip($extras);
}
/**
* @param $msg_content
* @param array $extras
* @return void
* @example $extras = ['title' => 'title', 'content_type' => 'text', 'extras' => ['key' => 'value']
*/
public function message($msg_content, array $extras = [])
{
$this->push->message($msg_content, $extras);
}
/**
* 推送可选项
* @param array $options
* @return void
* @example $options = ['sendno' => 100, 'time_to_live' => 1, 'apns_production' => false, 'big_push_duration' => 1]
* sendno: 表示推送序号,纯粹用来作为 API 调用标识,
* time_to_live: 表示离线消息保留时长()
* apns_production: 表示APNs是否生产环境
* big_push_duration: 表示定速推送时长(分钟),又名缓慢推送
*/
public function options(array $options = [])
{
$this->push->options($options);
}
/**
* 发送短信通知
* @param int $delay 延迟时间,单位秒
* @param string $templateId 模板id
* @param array $param 模板参数
* @return void
*/
public function setSms(int $delay, string $templateId, array $param = [])
{
$this->push->setSms($delay, $templateId, $param);
}
/**
* 设备标签
* @param $tag
*/
public function addTag($tag)
{
$this->push->addTag($tag);
}
/**
* 设备标签AND
* @param $tag
*/
public function addTagAnd($tag)
{
$this->push->addTagAnd($tag);
}
/**
* 设备别名
* @param $alias
*/
public function addAlias($alias)
{
$this->push->addAlias($alias);
}
/**
* 所有用户
*/
public function addAllAudience()
{
$this->push->addAllAudience();
}
}

View File

@ -53,6 +53,20 @@ class Community extends BaseController
return app('json')->success($this->repository->getList($where, $page, $limit)); return app('json')->success($this->repository->getList($where, $page, $limit));
} }
/**
* @return mixed
* @author Qinii
*/
public function resale()
{
$where = $this->request->params(['keyword','status','username','category_id','topic_id','is_show','is_type','resale_type']);
$where['is_type'] = '3';
$where['order'] = 'start';
$where['is_del'] = 0;
[$page, $limit] = $this->getPage();
return app('json')->success($this->repository->getList($where, $page, $limit));
}
/** /**
* @param $id * @param $id
* @return mixed * @return mixed
@ -100,20 +114,21 @@ class Community extends BaseController
public function switchStatus($id) public function switchStatus($id)
{ {
$data = $this->request->params(['status', 'refusal']); $data = $this->request->params(['status', 'refusal', 'float_rate']);
if (!in_array($data['status'],[0,1,-1,-2])) if (!in_array($data['status'],[0,1,-1,-2]))
return app('json')->fail('状态类型错误'); return app('json')->fail('状态类型错误');
$data['is_show'] = ($data['status'] == 1) ? : 0; $data['is_show'] = ($data['status'] == 1) ? : 0;
$floatRate = $data['float_rate'] ?? 0;
if($floatRate < 0 || $floatRate > 100)
return app('json')->fail('浮动百分比错误');
if($data['status'] == -1 && empty($data['refusal'])) if($data['status'] == -1 && empty($data['refusal']))
return app('json')->fail('请填写拒绝理由'); return app('json')->fail('请填写拒绝理由');
if($data['status'] == -2 && empty($data['refusal'])) if($data['status'] == -2 && empty($data['refusal']))
return app('json')->fail('请填写下架原因'); return app('json')->fail('请填写下架原因');
if (!$this->repository->exists($id)) if (!$this->repository->exists($id))
return app('json')->fail('数据不存在'); return app('json')->fail('数据不存在');
$this->repository->setStatus($id,$data); $this->repository->setStatus($id,$data);
return app('json')->success('操作成功'); return app('json')->success('操作成功');
} }

View File

@ -99,6 +99,12 @@ class Merchant extends BaseController
public function create(MerchantValidate $validate) public function create(MerchantValidate $validate)
{ {
$data = $this->checkParam($validate); $data = $this->checkParam($validate);
if (!empty($data['mer_phone'])) {
$newUid = Db::name('User')->where('account', $data['mer_phone'])->value('uid', 0);
if ($newUid) {
return app('json')->fail('该商家手机号已存在账户,请更换手机');
}
}
$this->repository->createMerchant($data); $this->repository->createMerchant($data);
return app('json')->success('添加成功'); return app('json')->success('添加成功');
} }
@ -143,6 +149,11 @@ class Merchant extends BaseController
if (!$data['category_id'] || !$merchantCategoryRepository->exists($data['category_id'])) if (!$data['category_id'] || !$merchantCategoryRepository->exists($data['category_id']))
return app('json')->fail('商户分类不存在'); return app('json')->fail('商户分类不存在');
$newUid = Db::name('User')->where('account', $data['mer_phone'])->value('uid', -1);
$merId = Db::name('Merchant')->where('uid', $newUid)->value('mer_id', 0);
if ($newUid != -1 && $id != $merId) {
return app('json')->fail('该商家手机号已存在账户,请更换手机');
}
unset($data['mer_account'], $data['mer_password']); unset($data['mer_account'], $data['mer_password']);
$margin = $this->repository->checkMargin($id, $data['type_id']); $margin = $this->repository->checkMargin($id, $data['type_id']);
$data['margin'] = $margin['margin']; $data['margin'] = $margin['margin'];

View File

@ -43,6 +43,7 @@ use think\facade\Db;
use think\facade\Log; use think\facade\Log;
use think\facade\Queue; use think\facade\Queue;
use crmeb\jobs\SendSmsJob; use crmeb\jobs\SendSmsJob;
use crmeb\jobs\TestJob;
use app\controller\api\Ceshi; use app\controller\api\Ceshi;
/** /**
@ -53,6 +54,12 @@ use app\controller\api\Ceshi;
*/ */
class Auth extends BaseController class Auth extends BaseController
{ {
public function dotest()
{
Queue::push(SendSmsJob::class, ['tempId' => 'ORDER_CREATE', 'id' => 101]);
return app('json')->success();
}
public function test() public function test()
{ {
$type = $this->request->param('type'); $type = $this->request->param('type');
@ -196,8 +203,8 @@ class Auth extends BaseController
$data['is_wsxx'] = 0; $data['is_wsxx'] = 0;
$data['mer_info'] = []; $data['mer_info'] = [];
// 判断是否是商户,并且有没有完善信息 // 判断是否是商户,并且有没有完善信息
//这里有点小问题以后要修改 // 这里有点小问题以后要修改
$store_service = Db::name('store_service')->where('uid', $data['uid'])->find(); $store_service = Db::name('store_service')->where('uid', $data['uid'])->find();
if ($store_service) { if ($store_service) {
$mer_arr = Db::name('merchant')->where('mer_id', $store_service['mer_id'])->where('is_del', 0)->where('status', 1)->field('type_id,mer_avatar,mer_banner,mer_info,category_id,service_phone,mer_address,uid,mer_name')->find(); $mer_arr = Db::name('merchant')->where('mer_id', $store_service['mer_id'])->where('is_del', 0)->where('status', 1)->field('type_id,mer_avatar,mer_banner,mer_info,category_id,service_phone,mer_address,uid,mer_name')->find();
@ -393,6 +400,25 @@ class Auth extends BaseController
return app('json')->success(); return app('json')->success();
} }
/**
* 绑定极光register_id
* @param UserRepository $repository
* @return mixed
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function bindJg(UserRepository $repository)
{
$phone = $this->request->param('phone');
$jgRegisterId = $this->request->param('jg_register_id');
$user = $repository->accountByUser($phone);
if ($user->save(['jg_register_id' => $jgRegisterId]) === false) {
return app('json')->fail('绑定失败');
}
return app('json')->success();
}
public function getCaptcha() public function getCaptcha()
{ {
$codeBuilder = new CaptchaBuilder(null, new PhraseBuilder(4)); $codeBuilder = new CaptchaBuilder(null, new PhraseBuilder(4));
@ -843,4 +869,183 @@ class Auth extends BaseController
return app('json')->success('短信发送成功'); return app('json')->success('短信发送成功');
} }
//物流系统扫码取货确认商家发货
public function deliveryGoods($id)
{
$orderSn = $this->request->param('order_sn');
$logisticsCode = $this->request->param('logistics_code') ?? '';
if (empty($orderSn)) {
return app('json')->fail('参数order_sn不能为空');
}
if (empty($logisticsCode)) {
app()->make(StoreOrderRepository::class)->deliveryGoods($id, $orderSn);
return app('json')->success('快递员扫描取件成功');
} else {
app()->make(StoreOrderRepository::class)->deliveryGoods($id, $orderSn, $logisticsCode);
return app('json')->success('快递员已完成送货');
}
}
//根据地址信息查询汇总信息
public function orderStatistics()
{
$cityCode = $this->request->param('city_code', '');
$districtCode = $this->request->param('district_code', '');
$streetCode = $this->request->param('street_code', '');
$villageCode = $this->request->param('village_code', '');
$brigadeId = $this->request->param('brigade_id', 0);
$startDate = $this->request->param('start_date', '');
$endDate = $this->request->param('end_date', '');
$queryBuilder = Db::name('ProductOrderLog')->where('status', 1);
if ($cityCode) {
$queryBuilder = $queryBuilder->where('city_code', $cityCode);
}
if ($districtCode) {
$queryBuilder = $queryBuilder->where('district_code', $districtCode);
}
if ($streetCode) {
$queryBuilder = $queryBuilder->where('street_code', $streetCode);
}
if ($villageCode) {
$queryBuilder = $queryBuilder->where('village_code', $villageCode);
}
if ($brigadeId) {
$queryBuilder = $queryBuilder->where('brigade_id', $brigadeId);
}
if ($startDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '>=', trim($startDate));
}
if ($endDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '<=', trim($endDate) . ' 23:59:59');
}
$orderNum = $queryBuilder->count();
$productNum = $queryBuilder->sum('product_num');
$totalPrice = $queryBuilder->sum('total_price');
$data = [
'where' => $this->request->param(),
'order_num' => $orderNum,
'product_num' => $productNum,
'total_price' => $totalPrice
];
return app('json')->success($data);
}
//根据地址信息查询订单列表
public function orderList()
{
[$page, $limit] = $this->getPage();
$cityCode = $this->request->param('city_code', '');
$districtCode = $this->request->param('district_code', '');
$streetCode = $this->request->param('street_code', '');
$villageCode = $this->request->param('village_code', '');
$brigadeId = $this->request->param('brigade_id', 0);
$startDate = $this->request->param('start_date', '');
$endDate = $this->request->param('end_date', '');
$queryBuilder = Db::name('ProductOrderLog')->where('status', 1);
if ($cityCode) {
$queryBuilder = $queryBuilder->where('city_code', $cityCode);
}
if ($districtCode) {
$queryBuilder = $queryBuilder->where('district_code', $districtCode);
}
if ($streetCode) {
$queryBuilder = $queryBuilder->where('street_code', $streetCode);
}
if ($villageCode) {
$queryBuilder = $queryBuilder->where('village_code', $villageCode);
}
if ($brigadeId) {
$queryBuilder = $queryBuilder->where('brigade_id', $brigadeId);
}
if ($startDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '>=', trim($startDate));
}
if ($endDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '<=', trim($endDate) . ' 23:59:59');
}
$count = $queryBuilder->count();
$list = $queryBuilder->setOption('field', [])->field(['id', 'order_id', 'product_num', 'product_price', 'total_price', 'city_code', 'district_code', 'street_code', 'village_code', 'brigade_id', 'create_time'])->order('id', 'desc')->page($page, $limit)->fetchSql(false)->select();
$orderIdList = [];
if ($list) {
$orderIdArray = $list->column('order_id');
if (count($orderIdArray) > 0) {
$orderIdList = Db::name('store_order')->whereIn('order_id', $orderIdArray)->fetchSql(false)->column('order_sn', 'order_id');
}
$list = $list->toArray();
};
foreach($list as $k=>$v) {
$list[$k]['order_sn'] = !empty($orderIdList[$v['order_id']]) ? $orderIdList[$v['order_id']] : '';
}
return app('json')->success(compact('count', 'list'));
}
//根据地址信息查询商家数
public function merStatistics()
{
$districtCode = $this->request->param('district_code', '');
$streetCode = $this->request->param('street_code', '');
$villageCode = $this->request->param('village_code', '');
$startDate = $this->request->param('start_date', '');
$endDate = $this->request->param('end_date', '');
$villageId = Db::name('GeoVillage')->where('village_code', $villageCode)->fetchSql(false)->value('village_id', 0);
$queryBuilder = Db::name('Merchant')->where('status', 1);
if ($districtCode) {
$queryBuilder = $queryBuilder->where('area_id', $districtCode);
}
if ($streetCode) {
$queryBuilder = $queryBuilder->where('street_id', $streetCode);
}
if ($villageId) {
$queryBuilder = $queryBuilder->where('village_id', $villageId);
}
if ($startDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '>=', trim($startDate));
}
if ($endDate) {
$queryBuilder = $queryBuilder->whereTime('create_time', '<=', trim($endDate) . ' 23:59:59');
}
$merNum = $queryBuilder->fetchSql(false)->count();
$data = [
'where' => $this->request->param(),
'mer_num' => $merNum
];
return app('json')->success($data);
}
//根据地址信息查询商品数
public function goodsStatistics()
{
$districtCode = $this->request->param('district_code', '');
$streetCode = $this->request->param('street_code', '');
$villageCode = $this->request->param('village_code', '');
$startDate = $this->request->param('start_date', '');
$endDate = $this->request->param('end_date', '');
$villageId = Db::name('GeoVillage')->where('village_code', $villageCode)->fetchSql(false)->value('village_id', 0);
$queryBuilder = Db::name('Merchant')->where('status', 1);
if ($districtCode) {
$queryBuilder = $queryBuilder->where('area_id', $districtCode);
}
if ($streetCode) {
$queryBuilder = $queryBuilder->where('street_id', $streetCode);
}
if ($villageId) {
$queryBuilder = $queryBuilder->where('village_id', $villageId);
}
$merIdArray = $queryBuilder->fetchSql(false)->column('mer_id');
$prodQueryBuilder = Db::name('StoreProduct')->where('is_show', 1)->where('status', 1)->whereIn('mer_id', $merIdArray);
if ($startDate) {
$prodQueryBuilder = $prodQueryBuilder->whereTime('create_time', '>=', trim($startDate));
}
if ($endDate) {
$prodQueryBuilder = $prodQueryBuilder->whereTime('create_time', '<=', trim($endDate) . ' 23:59:59');
}
$goodsNum = $prodQueryBuilder->fetchSql(false)->count();
$data = [
'where' => $this->request->param(),
'goods_num' => $goodsNum
];
return app('json')->success($data);
}
} }

View File

@ -195,7 +195,7 @@ class Common extends BaseController
*/ */
public function wechatCombinePayNotify($type) public function wechatCombinePayNotify($type)
{ {
if (!in_array($type, ['order', 'presell'], true)) if (!in_array($type, ['order', 'presell', 'order_settle'], true))
throw new ValidateException('参数错误'); throw new ValidateException('参数错误');
try { try {
return WechatService::create()->handleCombinePayNotify($type); return WechatService::create()->handleCombinePayNotify($type);

View File

@ -12,18 +12,24 @@
namespace app\controller\api\community; namespace app\controller\api\community;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\community\CommunityRepository; use app\common\repositories\community\CommunityRepository;
use app\common\repositories\store\order\StoreOrderProductRepository; use app\common\repositories\store\order\StoreOrderProductRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\store\product\ProductRepository;
use app\common\repositories\system\RelevanceRepository; use app\common\repositories\system\RelevanceRepository;
use app\common\repositories\user\UserHistoryRepository; use app\common\repositories\user\UserHistoryRepository;
use app\common\repositories\user\UserRelationRepository; use app\common\repositories\user\UserRelationRepository;
use app\common\repositories\user\UserRepository; use app\common\repositories\user\UserRepository;
use app\common\service\JgPush;
use app\validate\api\CommunityValidate; use app\validate\api\CommunityValidate;
use crmeb\basic\BaseController; use crmeb\basic\BaseController;
use crmeb\services\MiniProgramService; use crmeb\services\MiniProgramService;
use think\App; use think\App;
use app\common\repositories\community\CommunityRepository as repository; use app\common\repositories\community\CommunityRepository as repository;
use think\exception\ValidateException; use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Log;
class Community extends BaseController class Community extends BaseController
{ {
@ -54,7 +60,7 @@ class Community extends BaseController
*/ */
public function lst() public function lst()
{ {
$where = $this->request->params(['keyword','topic_id','is_hot','category_id','spu_id']); $where = $this->request->params(['keyword','topic_id','is_hot','category_id','spu_id', 'is_type', 'resale_type']);
if (!$where['category_id']) { if (!$where['category_id']) {
unset($where['category_id']); unset($where['category_id']);
} else if ($where['category_id'] == -1) { } else if ($where['category_id'] == -1) {
@ -266,7 +272,7 @@ class Community extends BaseController
public function checkParams() public function checkParams()
{ {
$data = $this->request->params(['image','topic_id','content','spu_id','order_id',['is_type',1],'video_link']); $data = $this->request->params(['image','topic_id','content','spu_id','order_id',['is_type',1],'video_link', 'resale_type', 'product_info']);
$config = systemConfig(["community_app_switch",'community_audit','community_video_audit']); $config = systemConfig(["community_app_switch",'community_audit','community_video_audit']);
$data['status'] = 0; $data['status'] = 0;
$data['is_show'] = 0; $data['is_show'] = 0;
@ -278,7 +284,7 @@ class Community extends BaseController
$data['is_show'] = 1; $data['is_show'] = 1;
$data['status_time'] = date('Y-m-d H:i:s', time()); $data['status_time'] = date('Y-m-d H:i:s', time());
} }
} else { } elseif ($data['is_type'] == 2) {
if (!in_array($this->repository::COMMUNIT_TYPE_VIDEO,$config['community_app_switch'])) if (!in_array($this->repository::COMMUNIT_TYPE_VIDEO,$config['community_app_switch']))
throw new ValidateException('短视频未开启'); throw new ValidateException('短视频未开启');
if ($config['community_video_audit']) { if ($config['community_video_audit']) {
@ -287,9 +293,7 @@ class Community extends BaseController
$data['status_time'] = date('Y-m-d H:i:s', time()); $data['status_time'] = date('Y-m-d H:i:s', time());
} }
if (!$data['video_link']) throw new ValidateException('请上传视频'); if (!$data['video_link']) throw new ValidateException('请上传视频');
} }
$data['content'] = filter_emoji($data['content']); $data['content'] = filter_emoji($data['content']);
MiniProgramService::create()->msgSecCheck($this->request->userInfo(), $data['content'],3,0); MiniProgramService::create()->msgSecCheck($this->request->userInfo(), $data['content'],3,0);
app()->make(CommunityValidate::class)->check($data); app()->make(CommunityValidate::class)->check($data);
@ -425,4 +429,201 @@ class Community extends BaseController
if (!$url) return app('json')->fail('二维码生成失败'); if (!$url) return app('json')->fail('二维码生成失败');
return app('json')->success(compact('url')); return app('json')->success(compact('url'));
} }
public function getOrderList()
{
[$page, $limit] = $this->getPage();
$keyword = $this->request->param('keyword');
/** @var StoreOrderRepository $repo */
$repo = app()->make(StoreOrderRepository::class);
$list = $repo->purchaseOrder(['uid' => $this->request->uid()], $keyword, $page, $limit);
return app('json')->success($list);
}
public function product()
{
[$page, $limit] = $this->getPage();
$keyword = $this->request->param('keyword');
$list = app()->make(ProductRepository::class)->communityProduct(['uid' => $this->request->uid()], $keyword, $page, $limit);
return app('json')->success($list);
}
/**
* 转售加购
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function addCart()
{
$communityId = $this->request->param('community_id');
$cartIds = $this->repository->addCart($this->request->uid(), $communityId);
return app('json')->success(['cart_id' => $cartIds]);
}
/**
* 转售商品列表
* @return mixed
*/
public function resaleList()
{
[$page, $limit] = $this->getPage();
$status = $this->request->param('status');
$queryBuilder = Db::name('community')->alias('c')->leftJoin('resale r','c.community_id = r.community_id')->where('c.is_type', 3)->where('c.is_del', 0)->where('c.uid', $this->request->uid());
// 在售商品
if ($status == 1) {
$queryBuilder->where('c.status', 1)->where('c.is_show', 1)->where(function ($query) {
$query->where(function ($conn) {
$conn->where('c.resale_type', 1)->where('r.status', 0);
});
$query->whereOr(function ($conn) {
$conn->where('c.resale_type', 2)->where('c.mer_status', 1)->where('r.status', 0);
});
});
}
// 已售出商品
if ($status == 2) {
$queryBuilder->where('c.status', 1)->where('r.status', 1);
}
// 待审核
if ($status == 3) {
$queryBuilder->where('c.status', 0);
}
// 审核未通过
if ($status == 4) {
$queryBuilder->where('c.status', -1);
}
// 审核通过
if ($status == 5) {
$queryBuilder->where('c.status', 1);
}
$count = $queryBuilder->count();
$list = $queryBuilder->setOption('field', [])->field(['c.community_id', 'c.title', 'c.image', 'c.resale_type', 'c.mer_status', 'SUM(`r`.`number` * `r`.`price`) AS total_price', 'SUM(`r`.`number` * `r`.`price` * (100 - `r`.`float_rate`) / 100) AS discount_price'])->group('c.community_id')->order('c.community_id', 'desc')->page($page, $limit)->fetchSql(false)->select();
if ($list) $list = $list->toArray();
foreach($list as $k=>&$v) {
$list[$k]['discount_price'] = round($v['discount_price'], 2);
}
return app('json')->success(compact('count', 'list'));
}
/**
* 删除转售商品
* @return mixed
*/
public function deleteResale($id)
{
$communityInfo = Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->find();
if (!$communityInfo) {
return app('json')->fail('转售商品不存在');
}
Db::startTrans();
try {
$list = Db::name('resale')->where('community_id', $id)->where('is_del', 0)->where('status', 0)->select();
foreach($list as $prod) {
Db::name('store_product')->where('product_id', $prod['product_id'])->inc('stock', $prod['number'])->update();
Db::name('store_product_attr_value')->where('product_id', $prod['product_id'])->where('unique', $prod['product_attr_unique'])->inc('stock', $prod['number'])->update();
}
Db::name('resale')->where('community_id', $id)->where('status', 0)->update(['is_del' => 1]);
Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->update(['is_del' => 1]);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
return app('json')->fail('删除转售商品失败');
}
return app('json')->success('删除成功');
}
/**
* 审核转售商品结算价
* @return mixed
*/
public function checkResale($id)
{
$communityInfo = Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->find();
if (!$communityInfo) {
return app('json')->fail('转售商品不存在');
}
$status = $this->request->param('status');
if (!$status) {
app('json')->fail('请设置审核状态');
}
if ($status == 1) {
Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->update(['status' => $status, 'mer_status' => 1]);
}
if ($status == 2) {
Db::startTrans();
try {
$list = Db::name('resale')->where('community_id', $id)->where('is_del', 0)->where('status', 0)->select();
foreach($list as $prod) {
Db::name('store_product')->where('product_id', $prod['product_id'])->inc('stock', $prod['number'])->update();
Db::name('store_product_attr_value')->where('product_id', $prod['product_id'])->where('unique', $prod['product_attr_unique'])->inc('stock', $prod['number'])->update();
}
Db::name('resale')->where('community_id', $id)->where('status', 0)->update(['is_del' => 1]);
Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->update(['is_del' => 1, 'status' => $status, 'mer_status' => 2]);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
return app('json')->fail('审核商品折扣价失败');
}
}
return app('json')->success('审核操作成功');
}
/**
* 转售商品详情
* @return mixed
*/
public function resaleDetail($id)
{
$communityInfo = Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->find();
if (!$communityInfo) {
return app('json')->fail('转售商品不存在');
}
return app('json')->success($this->repository->show($id, $this->user));
}
/**
* 编辑转售商品
* @return mixed
*/
public function editResale($id)
{
$communityInfo = Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->where('is_del', 0)->find();
if (!$communityInfo) {
return app('json')->fail('转售商品不存在');
}
$data = $this->checkParams();
$this->checkUserAuth();
Db::startTrans();
try {
$list = Db::name('resale')->where('community_id', $id)->where('is_del', 0)->where('status', 0)->select();
foreach($list as $prod) {
Db::name('store_product')->where('product_id', $prod['product_id'])->inc('stock', $prod['number'])->update();
Db::name('store_product_attr_value')->where('product_id', $prod['product_id'])->where('unique', $prod['product_attr_unique'])->inc('stock', $prod['number'])->update();
}
Db::name('resale')->where('community_id', $id)->where('status', 0)->update(['is_del' => 1]);
Db::name('community')->where('uid', $this->request->uid())->where('community_id', $id)->update(['is_del' => 1, 'status' => -1]);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
return app('json')->fail('编辑转售商品失败');
}
$data['uid'] = $this->request->uid();
$res = $this->repository->create($data);
return app('json')->success(['community_id' => $res]);
}
/**
* 发布委托商品
* @return \think\response\Json
*/
public function entrust()
{
$data = $this->checkParams();
$this->checkUserAuth();
$data['uid'] = $this->request->uid();
$res = $this->repository->create($data);
return app('json')->success(['community_id' => $res]);
}
} }

View File

@ -14,6 +14,7 @@
namespace app\controller\api\server; namespace app\controller\api\server;
use app\common\model\store\order\StoreGroupOrder;
use app\common\repositories\delivery\DeliveryStationRepository; use app\common\repositories\delivery\DeliveryStationRepository;
use app\common\repositories\store\order\StoreOrderRepository; use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\store\order\StoreRefundOrderRepository; use app\common\repositories\store\order\StoreRefundOrderRepository;
@ -35,10 +36,10 @@ class StoreOrder extends BaseController
public function orderStatistics($merId, StoreOrderRepository $repository) public function orderStatistics($merId, StoreOrderRepository $repository)
{ {
$product_type=$this->request->param('product_type',0); $product_type=$this->request->param('product_type',0);
$order = $repository->OrderTitleNumber($merId, null,$product_type); $order = $repository->OrderTitleNumber($merId, null,$product_type);
$order['refund'] = app()->make(StoreRefundOrderRepository::class)->getWhereCount(['is_system_del' => 0, 'mer_id' => $merId]); $order['refund'] = app()->make(StoreRefundOrderRepository::class)->getWhereCount(['is_system_del' => 0, 'mer_id' => $merId]);
/** @var Common $common */
$common = app()->make(Common::class); $common = app()->make(Common::class);
$data = []; $data = [];
$data['today'] = $common->mainGroup('today', $merId); $data['today'] = $common->mainGroup('today', $merId);
@ -199,6 +200,17 @@ class StoreOrder extends BaseController
return app('json')->success('发货成功'); return app('json')->success('发货成功');
} }
/**
* TODO 扫描发货
* @param $orderId
* @param $orderSn
*/
public function deliveryGoods($orderId, $orderSn, StoreOrderRepository $repository)
{
app()->make(StoreOrderRepository::class)->takeGoods($orderId, $orderSn);
return app('json')->success('扫描发货成功');
}
public function payPrice($merId, StoreOrderRepository $repository) public function payPrice($merId, StoreOrderRepository $repository)
{ {
list($start, $stop, $month) = $this->request->params([ list($start, $stop, $month) = $this->request->params([
@ -338,4 +350,57 @@ class StoreOrder extends BaseController
return app('json')->success('订单核销成功'); return app('json')->success('订单核销成功');
} }
/**
* 订单结算
* @return mixed
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function settle(StoreOrderRepository $repository)
{
$id = $this->request->param('id/d');
$payType = $this->request->param('pay_type');
if ($payType == 'creditBuy') {
return app('json')->fail('支付方式不支持');
}
try {
$data = $repository->settle($id, $payType, $this->request->userInfo());
return app('json')->success('success', $data);
} catch (\Exception $e) {
return app('json')->fail($e->getMessage());
}
}
/**
* 确认接单
* @return mixed
*/
public function confirm(StoreOrderRepository $repository)
{
$id = $this->request->param('id/d');
$type = $this->request->param('type/d');
try {
$repository->confirm($id, $type);
return app('json')->success('success');
} catch (\Exception $e) {
return app('json')->fail($e->getMessage());
}
}
/**
* 采购订单列表
* @param $merId
* @param StoreOrderRepository $orderRepository
* @return \think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function purchaseOrder($merId, StoreOrderRepository $orderRepository)
{
[$page, $limit] = $this->getPage();
$keyword = $this->request->param('keyword');
$list = $orderRepository->purchaseOrder(['mer_id' => $merId], $keyword, $page, $limit);
return app('json')->success($list);
}
} }

View File

@ -216,4 +216,17 @@ class StoreProduct extends BaseController
$this->repository->update($id, ['is_good' => $is_good]); $this->repository->update($id, ['is_good' => $is_good]);
return app('json')->success('修改成功'); return app('json')->success('修改成功');
} }
/**
* 商品入库
* @return mixed
* @throws \Exception
*/
public function stockIn()
{
$params = $this->request->param();
$this->repository->stockIn($this->merId, $params);
return app('json')->success('入库成功');
}
} }

View File

@ -12,6 +12,7 @@
namespace app\controller\api\store\merchant; namespace app\controller\api\store\merchant;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\store\MerchantTakeRepository; use app\common\repositories\store\MerchantTakeRepository;
use app\common\repositories\store\product\ProductRepository; use app\common\repositories\store\product\ProductRepository;
use app\common\repositories\system\config\ConfigValueRepository; use app\common\repositories\system\config\ConfigValueRepository;
@ -54,7 +55,7 @@ class Merchant extends BaseController
public function lst() public function lst()
{ {
[$page, $limit] = $this->getPage(); [$page, $limit] = $this->getPage();
$where = $this->request->params(['keyword', 'order', 'is_best', 'location', 'category_id', 'type_id','is_trader', 'street_id']); $where = $this->request->params(['keyword', 'order', 'is_best', 'location', 'category_id', 'type_id','is_trader', 'street_id', 'credit_buy']);
if (empty($where['type_id'])) { if (empty($where['type_id'])) {
$where['type_id'] = [MerchantModel::TypeCloudWarehouse, MerchantModel::TypeStore, MerchantModel::TypeSupplyChain, MerchantModel::TypePlatform]; $where['type_id'] = [MerchantModel::TypeCloudWarehouse, MerchantModel::TypeStore, MerchantModel::TypeSupplyChain, MerchantModel::TypePlatform];
} }
@ -163,6 +164,9 @@ class Merchant extends BaseController
'long', 'long',
'lat', 'lat',
['delivery_way',[2]], ['delivery_way',[2]],
'credit_buy',
'settle_cycle',
'interest_rate',
]); ]);
// 如果手机号不存在,则使用入驻时的手机号 // 如果手机号不存在,则使用入驻时的手机号
@ -247,8 +251,8 @@ class Merchant extends BaseController
public function apply($merId){ public function apply($merId){
$merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find(); $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
if ($this->userInfo['uid'] != $merchant->uid){ if (($msg = $this->checkAuth($merchant)) !== true) {
return app('json')->fail('你不是管理员无法进行提现操作'); return app('json')->fail($msg);
} }
$extract_minimum_line = systemConfig('extract_minimum_line') ?: 0; $extract_minimum_line = systemConfig('extract_minimum_line') ?: 0;
$extract_minimum_num = systemConfig('extract_minimum_num'); $extract_minimum_num = systemConfig('extract_minimum_num');
@ -280,8 +284,8 @@ class Merchant extends BaseController
{ {
$data = $this->request->param(['extract_money','financial_type', 'financial_bank_name', 'financial_bank_bank', 'financial_bank_code', 'financial_bank_branch']); $data = $this->request->param(['extract_money','financial_type', 'financial_bank_name', 'financial_bank_bank', 'financial_bank_code', 'financial_bank_branch']);
$merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('reg_admin_id,uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find(); $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('reg_admin_id,uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
if ($this->userInfo['uid'] != $merchant->uid){ if (($msg = $this->checkAuth($merchant)) !== true) {
return app('json')->fail('你不是管理员无法进行提现操作'); return app('json')->fail($msg);
} }
$bankInfo = [ $bankInfo = [
'name' => $data['financial_bank_name'], 'name' => $data['financial_bank_name'],
@ -299,8 +303,8 @@ class Merchant extends BaseController
public function listApply($merId) public function listApply($merId)
{ {
$merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('reg_admin_id,uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find(); $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('reg_admin_id,uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
if ($this->userInfo['uid'] != $merchant->uid){ if (($msg = $this->checkAuth($merchant)) !== true) {
return app('json')->fail('你不是管理员无法进行提现操作'); return app('json')->fail($msg);
} }
[$page, $limit] = $this->getPage(); [$page, $limit] = $this->getPage();
$where['mer_id'] = $merId; $where['mer_id'] = $merId;
@ -312,8 +316,8 @@ class Merchant extends BaseController
public function account($merId) public function account($merId)
{ {
$merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find(); $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
if ($this->userInfo['uid'] != $merchant->uid){ if (($msg = $this->checkAuth($merchant)) !== true) {
return app('json')->fail('你不是管理员无法进行提现操作'); return app('json')->fail($msg);
} }
$data = [ $data = [
'financial_bank' => $merchant->financial_bank,//银行卡信息 'financial_bank' => $merchant->financial_bank,//银行卡信息
@ -329,8 +333,8 @@ class Merchant extends BaseController
$data = $this->request->param(['name','bank','bank_code','financial_type']); $data = $this->request->param(['name','bank','bank_code','financial_type']);
app()->make(MerchantFinancialAccountValidate::class)->check($data); app()->make(MerchantFinancialAccountValidate::class)->check($data);
$merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find(); $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('uid,mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
if ($this->userInfo['uid'] != $merchant->uid){ if (($msg = $this->checkAuth($merchant)) !== true) {
return app('json')->fail('你不是管理员无法进行提现操作'); return app('json')->fail($msg);
} }
$update = [ $update = [
'name' => $data['name'], 'name' => $data['name'],
@ -340,4 +344,16 @@ class Merchant extends BaseController
app()->make(MerchantRepository::class)->update($merId,['financial_bank' => json_encode($update),'financial_type' => 1]); app()->make(MerchantRepository::class)->update($merId,['financial_bank' => json_encode($update),'financial_type' => 1]);
return app('json')->success('提交成功'); return app('json')->success('提交成功');
} }
public function checkAuth($merchant)
{
if ($this->userInfo['uid'] != $merchant->uid) {
return '你不是管理员无法进行提现操作';
}
$unSettleCount = StoreOrderInterest::where('mer_id', $merchant->mer_id)->where('status', StoreOrderInterest::STATUS_UNSETTLED)->whereTime('start_time', '<=', time())->count();
if ($unSettleCount > 0) {
return '有未结清的订单,请结清订单后再进行提现';
}
return true;
}
} }

View File

@ -21,6 +21,7 @@ use crmeb\services\SmsService;
use crmeb\services\SwooleTaskService; use crmeb\services\SwooleTaskService;
use crmeb\services\YunxinSmsService; use crmeb\services\YunxinSmsService;
use think\App; use think\App;
use think\facade\Db;
use crmeb\basic\BaseController; use crmeb\basic\BaseController;
use app\common\repositories\system\merchant\MerchantIntentionRepository as repository; use app\common\repositories\system\merchant\MerchantIntentionRepository as repository;
use think\exception\ValidateException; use think\exception\ValidateException;
@ -44,6 +45,14 @@ class MerchantIntention extends BaseController
return app('json')->fail('未开启商户入驻'); return app('json')->fail('未开启商户入驻');
} }
if ($this->userInfo) $data['uid'] = $this->userInfo->uid; if ($this->userInfo) $data['uid'] = $this->userInfo->uid;
$newUid = Db::name('User')->where('account', $data['phone'])->value('uid', -1);
if ($newUid != -1 && $this->userInfo->uid != $newUid) {
throw new ValidateException('该申请手机已存在账户,不可申请');
}
$newMerid = Db::name('Merchant')->where('mer_phone', $data['phone'])->value('mer_id', -1);
if ($newMerid != -1) {
throw new ValidateException('该申请手机已存在商户,不可申请');
}
$make = app()->make(MerchantRepository::class); $make = app()->make(MerchantRepository::class);
if ($make->fieldExists('mer_name', $data['mer_name'])) if ($make->fieldExists('mer_name', $data['mer_name']))
throw new ValidateException('商户名称已存在,不可申请'); throw new ValidateException('商户名称已存在,不可申请');
@ -72,6 +81,9 @@ class MerchantIntention extends BaseController
if (!systemConfig('mer_intention_open')) { if (!systemConfig('mer_intention_open')) {
return app('json')->fail('未开启商户入驻'); return app('json')->fail('未开启商户入驻');
} }
if (!empty($data['mer_phone'])) {
unset($data['mer_phone']);
}
$data['create_time'] = date('Y-m-d H:i:s', time()); $data['create_time'] = date('Y-m-d H:i:s', time());
$this->repository->updateIntention((int)$id, $data); $this->repository->updateIntention((int)$id, $data);
SwooleTaskService::admin('notice', [ SwooleTaskService::admin('notice', [

View File

@ -14,6 +14,7 @@
namespace app\controller\api\store\order; namespace app\controller\api\store\order;
use app\common\model\store\order\StoreGroupOrder;
use app\common\repositories\delivery\DeliveryOrderRepository; use app\common\repositories\delivery\DeliveryOrderRepository;
use app\common\repositories\store\order\StoreOrderCreateRepository; use app\common\repositories\store\order\StoreOrderCreateRepository;
use app\common\repositories\store\order\StoreOrderReceiptRepository; use app\common\repositories\store\order\StoreOrderReceiptRepository;
@ -22,10 +23,12 @@ use crmeb\basic\BaseController;
use app\common\repositories\store\order\StoreCartRepository; use app\common\repositories\store\order\StoreCartRepository;
use app\common\repositories\store\order\StoreGroupOrderRepository; use app\common\repositories\store\order\StoreGroupOrderRepository;
use app\common\repositories\store\order\StoreOrderRepository; use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\user\UserAddressRepository;
use think\exception\ValidateException;
use crmeb\services\ExpressService; use crmeb\services\ExpressService;
use crmeb\services\LockService; use crmeb\services\LockService;
use think\facade\Db;
use think\App; use think\App;
use think\exception\ValidateException;
use think\facade\Log; use think\facade\Log;
/** /**
@ -80,12 +83,10 @@ class StoreOrder extends BaseController
$mark = (array)$this->request->param('mark', []); $mark = (array)$this->request->param('mark', []);
$payType = $this->request->param('pay_type'); $payType = $this->request->param('pay_type');
$post = (array)$this->request->param('post'); $post = (array)$this->request->param('post');
$isPc = $payType === 'pc'; $isPc = $payType === 'pc';
if ($isPc) { if ($isPc) {
$payType = 'balance'; $payType = 'balance';
} }
if (!in_array($payType, StoreOrderRepository::PAY_TYPE, true)) if (!in_array($payType, StoreOrderRepository::PAY_TYPE, true))
return app('json')->fail('请选择正确的支付方式'); return app('json')->fail('请选择正确的支付方式');
@ -98,8 +99,30 @@ class StoreOrder extends BaseController
$uid = $this->request->uid(); $uid = $this->request->uid();
if (!($count = count($cartId)) || $count != count($cartRepository->validIntersection($cartId, $uid))) if (!($count = count($cartId)) || $count != count($cartRepository->validIntersection($cartId, $uid)))
return app('json')->fail('数据无效'); return app('json')->fail('数据无效');
// if (!$addressId)
// return app('json')->fail('请选择地址'); if ($addressId) {
$deliveryWay = !empty($takes[0]) ? $takes[0] : 0;
$addressRepository = app()->make(UserAddressRepository::class);
$address = $addressRepository->getWhere(['uid' => $uid, 'address_id' => $addressId]);
$cartProductType = Db::name('StoreCart')->where('cart_id', $cartId[0] ?? 0)->value('product_type');
if ($cartProductType == 0 && $deliveryWay != 1) {
$userAddressCode = ($address['province_code'] ?? '') . ',' . ($address['city_code'] ?? '') . ',' . ($address['district_code'] ?? '') . ',' . ($address['street_code'] ?? '') . ',' . ($address['village_code'] ?? '') . ',' . ($address['brigade_id'] ?? 0);
$getUrl = env('LOGISTICS_HOST_URL') . '/api/hasCourier?user_address_code=' . $userAddressCode;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $getUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
$hasCourierData = curl_exec($ch);
curl_close($ch);
if (!empty($hasCourierData) && is_string($hasCourierData)) {
$courierData = json_decode($hasCourierData, true);
if (empty($courierData['code']) || $courierData['code'] != 1) {
throw new ValidateException('该收货区域未配送快递员');
}
}
}
}
$groupOrder = app()->make(LockService::class)->exec('order.create', function () use ($orderCreateRepository, $receipt_data, $mark, $extend, $cartId, $payType, $takes, $couponIds, $useIntegral, $addressId, $post) { $groupOrder = app()->make(LockService::class)->exec('order.create', function () use ($orderCreateRepository, $receipt_data, $mark, $extend, $cartId, $payType, $takes, $couponIds, $useIntegral, $addressId, $post) {
return $orderCreateRepository->v2CreateOrder(array_search($payType, StoreOrderRepository::PAY_TYPE), $this->request->userInfo(), $cartId, $extend, $mark, $receipt_data, $takes, $couponIds, $useIntegral, $addressId, $post); return $orderCreateRepository->v2CreateOrder(array_search($payType, StoreOrderRepository::PAY_TYPE), $this->request->userInfo(), $cartId, $extend, $mark, $receipt_data, $takes, $couponIds, $useIntegral, $addressId, $post);
@ -109,8 +132,8 @@ class StoreOrder extends BaseController
$this->repository->paySuccess($groupOrder); $this->repository->paySuccess($groupOrder);
return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]); return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
} }
if ($isPc) { if ($isPc || $groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
return app('json')->success(['order_id' => $groupOrder->group_order_id]); return app('json')->status('error', '等待确认订单', ['order_id' => $groupOrder['group_order_id']]);
} }
try { try {
return $this->repository->pay($payType, $this->request->userInfo(), $groupOrder, $this->request->param('return_url'), $this->request->isApp()); return $this->repository->pay($payType, $this->request->userInfo(), $groupOrder, $this->request->param('return_url'), $this->request->isApp());
@ -134,7 +157,6 @@ class StoreOrder extends BaseController
$where['product_type'] = $this->request->param('product_type',0); $where['product_type'] = $this->request->param('product_type',0);
$where['search'] = $this->request->param('store_name'); $where['search'] = $this->request->param('store_name');
$where['uid'] = $this->request->uid(); $where['uid'] = $this->request->uid();
$where['paid'] = 1;
$where['is_user'] = 1; $where['is_user'] = 1;
return app('json')->success($this->repository->getList($where, $page, $limit)); return app('json')->success($this->repository->getList($where, $page, $limit));
} }
@ -163,7 +185,8 @@ class StoreOrder extends BaseController
*/ */
public function number() public function number()
{ {
return app('json')->success(['orderPrice' => $this->request->userInfo()->pay_price] + $this->repository->userOrderNumber($this->request->uid())); $productType = $this->request->param('product_type', 0);
return app('json')->success($this->repository->userOrderNumber($this->request->uid(), $productType));
} }
/** /**
@ -175,7 +198,8 @@ class StoreOrder extends BaseController
public function groupOrderList(StoreGroupOrderRepository $groupOrderRepository) public function groupOrderList(StoreGroupOrderRepository $groupOrderRepository)
{ {
[$page, $limit] = $this->getPage(); [$page, $limit] = $this->getPage();
$list = $groupOrderRepository->getList(['uid' => $this->request->uid(), 'paid' => 0], $page, $limit); $productType = $this->request->param('product_type', 0);
$list = $groupOrderRepository->getList(['uid' => $this->request->uid(), 'paid' => 0, 'product_type' => $productType], $page, $limit);
return app('json')->success($list); return app('json')->success($list);
} }
@ -193,7 +217,7 @@ class StoreOrder extends BaseController
if (!$groupOrder) if (!$groupOrder)
return app('json')->fail('订单不存在'); return app('json')->fail('订单不存在');
else else
return app('json')->success($groupOrder->append(['cancel_time', 'cancel_unix'])->toArray()); return app('json')->success($groupOrder);
} }
public function groupOrderStatus($id, StoreGroupOrderRepository $groupOrderRepository) public function groupOrderStatus($id, StoreGroupOrderRepository $groupOrderRepository)
@ -239,6 +263,9 @@ class StoreOrder extends BaseController
if (!$groupOrder) if (!$groupOrder)
return app('json')->fail('订单不存在或已支付'); return app('json')->fail('订单不存在或已支付');
$this->repository->changePayType($groupOrder, array_search($type, StoreOrderRepository::PAY_TYPE)); $this->repository->changePayType($groupOrder, array_search($type, StoreOrderRepository::PAY_TYPE));
if ($groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && !$groupOrder->orderList[0]->allowCreditPay()) {
return app('json')->fail('请等待商家确认订单');
}
if ($groupOrder['pay_price'] == 0) { if ($groupOrder['pay_price'] == 0) {
$this->repository->paySuccess($groupOrder); $this->repository->paySuccess($groupOrder);
return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]); return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
@ -277,6 +304,17 @@ class StoreOrder extends BaseController
return app('json')->success(['qrcode' => $this->repository->wxQrcode($id, $order->verify_code)]); return app('json')->success(['qrcode' => $this->repository->wxQrcode($id, $order->verify_code)]);
} }
public function logisticsCode($id)
{
$storeInfo = Db::name('store_service')->where('uid', $this->request->uid())->find();
if (!$storeInfo)
return app('json')->fail('商户信息有误');
$order = $this->repository->getWhere(['order_id' => $id, 'mer_id' => $storeInfo['mer_id'], 'is_del' => 0]);
if (!$order)
return app('json')->fail('订单状态有误');
return app('json')->success(['qrcode' => $this->repository->logisticsQrcode($id, $order->order_sn)]);
}
public function del($id) public function del($id)
{ {
$this->repository->userDel($id, $this->request->uid()); $this->repository->userDel($id, $this->request->uid());
@ -297,4 +335,5 @@ class StoreOrder extends BaseController
$res = $orderRepository->show($id, $this->request->uid()); $res = $orderRepository->show($id, $this->request->uid());
return app('json')->success($res); return app('json')->success($res);
} }
} }

View File

@ -130,6 +130,7 @@ class StoreRefundOrder extends BaseController
if (!$order->refund_status) if (!$order->refund_status)
return app('json')->fail('订单已过退款/退货期限'); return app('json')->fail('订单已过退款/退货期限');
if ($order->status < 0) return app('json')->fail('订单已退款'); if ($order->status < 0) return app('json')->fail('订单已退款');
if ($order->status == 1) return app('json')->fail('订单已发货不支持退款');
if ($order->status == 10) return app('json')->fail('订单不支持退款'); if ($order->status == 10) return app('json')->fail('订单不支持退款');
if($order->is_virtual && $data['refund_type'] == 2) return app('json')->fail('订单不支持退款退货'); if($order->is_virtual && $data['refund_type'] == 2) return app('json')->fail('订单不支持退款退货');
if ($type == 1) { if ($type == 1) {
@ -151,11 +152,13 @@ class StoreRefundOrder extends BaseController
public function lst() public function lst()
{ {
$type = $this->request->param('type'); $type = $this->request->param('type');
$productType = $this->request->param('product_type', 0);
[$page, $limit] = $this->getPage(); [$page, $limit] = $this->getPage();
return app('json')->success($this->repository->userList([ return app('json')->success($this->repository->userList([
'type' => $type, 'type' => $type,
'uid' => $this->request->uid(), 'uid' => $this->request->uid(),
'is_del' => 0, 'is_del' => 0,
'product_type' => $productType,
], $page, $limit)); ], $page, $limit));
} }

View File

@ -50,42 +50,13 @@ class StoreMicro extends BaseController
public function ProductImport(){ public function ProductImport(){
$product_id = $this->request->param('id', 0); $product_id = $this->request->param('id', 0);
$user = $this->request->userInfo(); $user = $this->request->userInfo();
$mer_id =Db::name('store_service')->where('uid',$user['uid'])->where('status',1)->value('mer_id'); try {
if ($mer_id==0) return app('json')->fail('商户id不能为空'); /** @var ProductRepository $productRepository */
$find=Db::name('store_product')->where('product_id',$product_id)->find(); $productRepository = app()->make(ProductRepository::class);
if($find){ $a = $productRepository->import($product_id, $user);
if($find['product_type']!=0){ } catch (\Exception $e) {
return app('json')->fail('该商品不是普通商品'); return app('json')->fail($e->getMessage());
}
$exist = Db::name('store_product')->where('old_product_id', $product_id)->where('mer_id', $mer_id)->find();
if($exist){
return app('json')->fail('已经导入过该商品了');
}
$find['attrValue']=Db::name('store_product_attr_value')->where('product_id',$find['product_id'])->field('image,price,cost,ot_price,svip_price,stock,bar_code,weight,volume')->select();
$find['content']=Db::name('store_product_content')->where('product_id',$find['product_id'])->value('content');
$find['is_show']=0;
$find['mer_id']=$mer_id;
$find['temp_id']="";
$find['give_coupon_ids']=[];
$find['params']=[];
$find['extend']=[];
$find['param_temp_id']=[];
$find['mer_labels']=[];
$find['attr']=[];
$find['delivery_way']=[ 0 => "2"];
$find["guarantee_template_id"] = "";
$find['product_type']=0;
$find['mer_cate_id']=[0 => 0];
$find['is_used']=1;
$find['status']=1;
$find['mer_status']=1;
$find['old_product_id']=$product_id;
$find['slider_image']=explode(',',$find['slider_image']);
unset($find['product_id'],$find['create_time']);
} }
/** @var ProductRepository $make */
$make = app()->make(ProductRepository::class);
$a=$make->create($find,0);
if($a){ if($a){
return app('json')->success(['data'=>$a,'msg'=>'导入成功']); return app('json')->success(['data'=>$a,'msg'=>'导入成功']);
}else{ }else{

View File

@ -16,6 +16,12 @@ namespace app\controller\api\user;
use app\common\repositories\store\CityAreaRepository; use app\common\repositories\store\CityAreaRepository;
use think\App; use think\App;
use crmeb\basic\BaseController; use crmeb\basic\BaseController;
use app\common\model\store\GeoProvince;
use app\common\model\store\GeoCity;
use app\common\model\store\GeoArea;
use app\common\model\store\GeoStreet;
use app\common\model\store\GeoVillage;
use app\common\model\store\GeoBrigade;
use app\validate\api\UserAddressValidate as validate; use app\validate\api\UserAddressValidate as validate;
use app\common\repositories\user\UserAddressRepository as repository; use app\common\repositories\user\UserAddressRepository as repository;
use think\exception\ValidateException; use think\exception\ValidateException;
@ -50,7 +56,84 @@ class UserAddress extends BaseController
if (!$this->repository->existsWhere(['address_id' => $id, 'uid' => $uid])) { if (!$this->repository->existsWhere(['address_id' => $id, 'uid' => $uid])) {
return app('json')->fail('地址不存在'); return app('json')->fail('地址不存在');
} }
return app('json')->success($this->repository->get($id, $uid)); $addinfo = $this->repository->get($id, $uid);
$area = [];
if (!empty($addinfo['province_id'])) {
$province = GeoProvince::where('province_id', $addinfo['province_id'])->find();
if ($province) {
$area[] = [
'type' => 'province',
'id' => $province->province_id,
'level' => 1,
'name' => $province->province_name ?? '',
'code' => $province->province_code ?? ''
];
}
}
if (!empty($addinfo['city_id'])) {
$city = GeoCity::where('city_id', $addinfo['city_id'])->find();
if ($city) {
$area[] = [
'type' => 'city',
'id' => $city['city_id'],
'level' => 2,
'name' => $city['city_name'] ?? '',
'code' => $city['city_code'] ?? ''
];
}
}
if (!empty($addinfo['district_id'])) {
$district = GeoArea::where('area_id', $addinfo['district_id'])->find();
if ($district) {
$area[] = [
'type' => 'area',
'id' => $district['area_id'],
'level' => 3,
'name' => $district['area_name'] ?? '',
'code' => $district['area_code'] ?? ''
];
}
}
if (!empty($addinfo['street_id'])) {
$street = GeoStreet::where('street_id', $addinfo['street_id'])->find();
if ($street) {
$area[] = [
'type' => 'street',
'id' => $street['street_id'],
'level' => 4,
'name' => $street['street_name'] ?? '',
'code' => $street['street_code'] ?? ''
];
}
}
if (!empty($addinfo['village_id'])) {
$village = GeoVillage::where('village_id', $addinfo['village_id'])->find();
if ($village) {
$area[] = [
'type' => 'village',
'id' => $village['village_id'],
'level' => 5,
'name' => $village['village_name'] ?? '',
'code' => $village['village_code'] ?? ''
];
}
}
$addinfo->areas = $area;
$addinfo->brigade = [];
if (!empty($addinfo['brigade_id'])) {
$brigade = GeoBrigade::where('id', $addinfo['brigade_id'])->find();
if ($brigade) {
$addinfo->brigade = [
'type' => 'brigade',
'id' => $brigade['id'],
'level' => 6,
'name' => $brigade['brigade_name'] ?? '',
'code' => $brigade['brigade_name'] ?? ''
];
}
}
return app('json')->success($addinfo);
} }
/** /**
@ -124,30 +207,69 @@ class UserAddress extends BaseController
*/ */
public function checkParams(validate $validate) public function checkParams(validate $validate)
{ {
$data = $this->request->params(['address_id', 'real_name', 'phone', 'area', 'detail', 'post_code', 'is_default']); $data = $this->request->params(['address_id', 'real_name', 'phone', 'area', 'detail', 'post_code', 'is_default', 'brigade']);
$validate->check($data); $validate->check($data);
[$province, $city, $district, $street] = ((array)$data['area']) + [null, null, null, null]; [$province, $city, $district, $street, $village] = ((array)$data['area']) + [null, null, null, null, null];
$last = $street ?? $district ?? $city ?? $province; $last = $village ?? $street ?? $district ?? $city ?? $province;
if (!$last) { if (!$last) {
throw new ValidateException('请选择正确的收货地址'); throw new ValidateException('请选择正确的收货地址');
} }
$make = app()->make(CityAreaRepository::class); if (!$this->repository->villageExists('village_code', $last['code'])) {
if (!$make->existsWhere(['id' => $last['id'], 'snum' => 0])) { throw new ValidateException('地址信息错误');
throw new ValidateException('请手动选择所在地区');
} }
if ($make->search([])->where('id', 'in', array_column($data['area'], 'id'))->count() !== count($data['area'])) {
throw new ValidateException('请选择正确的收货地址');
}
$data['province'] = $province['name']; $data['province'] = $province['name'];
$data['province_id'] = $province['id']; $data['province_id'] = $province['id'];
$data['province_code'] = '';
if (!empty($data['province_id'])) {
$province = GeoProvince::where('province_id', $data['province_id'])->find();
if ($province) {
$data['province_code'] = $province['province_code'];
}
}
$data['city'] = $city['name']; $data['city'] = $city['name'];
$data['city_id'] = $city['id']; $data['city_id'] = $city['id'];
$data['city_code'] = '';
if (!empty($data['city_id'])) {
$city = GeoCity::where('city_id', $data['city_id'])->find();
if ($city) {
$data['city_code'] = $city['city_code'];
}
}
$data['district'] = $district['name']; $data['district'] = $district['name'];
$data['district_id'] = $district['id']; $data['district_id'] = $district['id'];
$data['district_code'] = '';
if (!empty($data['district_id'])) {
$district = GeoArea::where('area_id', $data['district_id'])->find();
if ($district) {
$data['district_code'] = $district['area_code'];
}
}
if (isset($street)) { if (isset($street)) {
$data['street'] = $street['name']; $data['street'] = $street['name'] ?? '';
$data['street_id'] = $street['id']; $data['street_id'] = $street['id'] ?? 0;
$data['street_code'] = '';
if (!empty($data['street_id'])) {
$street = GeoStreet::where('street_id', $data['street_id'])->find();
if ($street) {
$data['street_code'] = $street['street_code'];
}
}
}
if (isset($village)) {
$data['village'] = $village['name'] ?? '';
$data['village_id'] = $village['id'] ?? 0;
$data['village_code'] = '';
if (!empty($data['village_id'])) {
$village = GeoVillage::where('village_id', $data['village_id'])->find();
if ($village) {
$data['village_code'] = $village['village_code'];
}
}
}
$brigade = $data['brigade'];
if (isset($brigade)) {
$data['brigade'] = $brigade['name'] ?? '';
$data['brigade_id'] = $brigade['id'] ?? 0;
} }
unset($data['area']); unset($data['area']);
return $data; return $data;

View File

@ -17,6 +17,7 @@ use think\App;
use crmeb\basic\BaseController; use crmeb\basic\BaseController;
use app\common\repositories\store\shipping\CityRepository as repository; use app\common\repositories\store\shipping\CityRepository as repository;
use think\facade\Log; use think\facade\Log;
use Overtrue\Pinyin\Pinyin;
class City extends BaseController class City extends BaseController
{ {
@ -49,6 +50,154 @@ class City extends BaseController
return app('json')->success(app()->make(CityAreaRepository::class)->getChildren(intval($pid))); return app('json')->success(app()->make(CityAreaRepository::class)->getChildren(intval($pid)));
} }
public function lstV3()
{
$provinceCode = $this->request->param('province_code') ?? '';
$cityCode = $this->request->param('city_code') ?? '';
$areaCode = $this->request->param('area_code') ?? '';
$streetCode = $this->request->param('street_code') ?? '';
$pinyin = $this->request->param('pinyin') ?? 0;
$list = app()->make(CityAreaRepository::class)->getGeoChildren(['province_code' => $provinceCode, 'city_code' => $cityCode, 'area_code' => $areaCode, 'street_code' => $streetCode]);
$geoList = [];
$pyList = [];
foreach ($list as $v) {
$temp = [];
if (!empty($v['village_id'])) {
if ($pinyin == 1) {
$py = strtoupper((new Pinyin)->abbr($v['village_name'])[0] ?? '-');
$pyList[$py][] = [
'type' => 'village',
'id' => $v['village_id'],
'level' => 5,
'name' => $v['village_name'] ?? '',
'code' => $v['village_code'] ?? ''
];
} else {
$temp = [
'type' => 'village',
'id' => $v['village_id'],
'level' => 5,
'name' => $v['village_name'] ?? '',
'code' => $v['village_code'] ?? ''
];
$geoList[] = $temp;
}
}
if (!empty($v['street_id'])) {
if ($pinyin == 1) {
$py = strtoupper((new Pinyin)->abbr($v['street_name'])[0] ?? '-');
$pyList[$py][] = [
'type' => 'street',
'id' => $v['street_id'],
'level' => 4,
'name' => $v['street_name'] ?? '',
'code' => $v['street_code'] ?? ''
];
} else {
$temp = [
'type' => 'street',
'id' => $v['street_id'],
'level' => 4,
'name' => $v['street_name'] ?? '',
'code' => $v['street_code'] ?? ''
];
$geoList[] = $temp;
}
}
if (!empty($v['area_id'])) {
if ($pinyin == 1) {
$py = strtoupper((new Pinyin)->abbr($v['area_name'])[0] ?? '-');
$pyList[$py][] = [
'type' => 'area',
'id' => $v['area_id'],
'level' => 3,
'name' => $v['area_name'] ?? '',
'code' => $v['area_code'] ?? ''
];
} else {
$temp = [
'type' => 'area',
'id' => $v['area_id'],
'level' => 3,
'name' => $v['area_name'] ?? '',
'code' => $v['area_code'] ?? ''
];
$geoList[] = $temp;
}
}
if (!empty($v['city_id'])) {
if ($pinyin == 1) {
$py = strtoupper((new Pinyin)->abbr($v['city_name'])[0] ?? '-');
$pyList[$py][] = [
'type' => 'city',
'id' => $v['city_id'],
'level' => 2,
'name' => $v['city_name'] ?? '',
'code' => $v['city_code'] ?? ''
];
} else {
$temp = [
'type' => 'city',
'id' => $v['city_id'],
'level' => 2,
'name' => $v['city_name'] ?? '',
'code' => $v['city_code'] ?? '',
];
$geoList[] = $temp;
}
}
if (!empty($v['province_id'])) {
if ($pinyin == 1) {
$py = strtoupper((new Pinyin)->abbr($v['province_name'])[0] ?? '-');
$pyList[$py][] = [
'type' => 'province',
'id' => $v['province_id'],
'level' => 1,
'name' => $v['province_name'] ?? '',
'code' => $v['province_code'] ?? ''
];
} else {
$temp = [
'type' => 'province',
'id' => $v['province_id'],
'level' => 1,
'name' => $v['province_name'] ?? '',
'code' => $v['province_code'] ?? ''
];
$geoList[] = $temp;
}
}
}
if ($pinyin == 1) {
$geoList = [];
foreach($pyList as $k=>$v) {
$temp = [];
$temp['pinyin'] = $k;
$temp['data'] = $pyList[$k];
$geoList[] = $temp;
}
}
return app('json')->success($geoList);
}
public function brigade()
{
$list = app()->make(CityAreaRepository::class)->getBrigade([]);
$geoList = [];
foreach ($list as $v) {
$temp = [
'type' => 'brigade',
'id' => $v['id'],
'level' => 6,
'name' => $v['brigade_name'] ?? '',
'code' => $v['brigade_name'] ?? ''
];
$geoList[] = $temp;
}
return app('json')->success($geoList);
}
public function cityList() public function cityList()
{ {
$address = $this->request->param('address'); $address = $this->request->param('address');

View File

@ -87,6 +87,9 @@ class Merchant extends BaseController
'long', 'long',
'lat', 'lat',
['delivery_way',[2]], ['delivery_way',[2]],
'credit_buy',
'settle_cycle',
'interest_rate',
]); ]);
$validate->check($data); $validate->check($data);
$sys_bases_status = systemConfig('sys_bases_status') === '0' ? 0 : 1; $sys_bases_status = systemConfig('sys_bases_status') === '0' ? 0 : 1;

View File

@ -55,18 +55,24 @@ return [
\crmeb\listens\AuthCancelActivityListen::class, \crmeb\listens\AuthCancelActivityListen::class,
\crmeb\listens\CloseUserSvipListen::class, \crmeb\listens\CloseUserSvipListen::class,
\crmeb\listens\SendSvipCouponListen::class, \crmeb\listens\SendSvipCouponListen::class,
\crmeb\listens\AutoCheckCreditBuyListen::class,
] : [], ] : [],
'pay_success_user_recharge' => [\crmeb\listens\pay\UserRechargeSuccessListen::class], 'pay_success_user_recharge' => [\crmeb\listens\pay\UserRechargeSuccessListen::class],
'pay_success_user_order' => [\crmeb\listens\pay\UserOrderSuccessListen::class], 'pay_success_user_order' => [\crmeb\listens\pay\UserOrderSuccessListen::class],
'pay_success_order' => [\crmeb\listens\pay\OrderPaySuccessListen::class], 'pay_success_order' => [\crmeb\listens\pay\OrderPaySuccessListen::class],
'pay_success_order_settle' => [\crmeb\listens\pay\OrderSettlePaySuccessListen::class],
'pay_success_micro_pay' => [\crmeb\listens\pay\OrderMicroPaySuccessListen::class], 'pay_success_micro_pay' => [\crmeb\listens\pay\OrderMicroPaySuccessListen::class],
'pay_success_presell' => [\crmeb\listens\pay\PresellPaySuccessListen::class], 'pay_success_presell' => [\crmeb\listens\pay\PresellPaySuccessListen::class],
'pay_success_meal' => [\crmeb\listens\pay\MealSuccessListen::class], 'pay_success_meal' => [\crmeb\listens\pay\MealSuccessListen::class],
// 'community_address'=>[\app\listener\CommunityAddress::class], // 'community_address'=>[\app\listener\CommunityAddress::class],
'order.paySuccessOrder'=>[\app\listener\paySuccessOrder::class], 'order.paySuccessOrder'=>[\app\listener\paySuccessOrder::class],
'order.sendGoodsCode'=>[\app\listener\SendGoodsCode::class],
'product.create'=>[\app\listener\ProductCreate::class], 'product.create'=>[\app\listener\ProductCreate::class],
'product.delivery'=>[\app\listener\DeliveryGoods::class],
'product.sell'=>[\app\listener\CloudProduct::class], //商品上下架 'product.sell'=>[\app\listener\CloudProduct::class], //商品上下架
'refund.after'=>[\app\listener\AfterRefund::class], 'refund.after'=>[\app\listener\AfterRefund::class],
'refund.deliver'=>[\app\listener\DeliverRefund::class],
'order.create'=>[\app\listener\OrderCreate::class],
], ],
'subscribe' => [], 'subscribe' => [],

View File

@ -0,0 +1,45 @@
<?php
declare (strict_types=1);
namespace app\listener;
use think\facade\Db;
use think\facade\Log;
/**
* 订单退款通知物流
*/
class DeliverRefund
{
public function handle($event)
{
$orderId = $event['refund']['order']['order_id'] ?? 0;
$orderSn = $event['refund']['order']['order_sn'] ?? '';
Log::info('物流退货 - orderId' . $orderId . ' orderSn' . $orderSn);
if ($orderId && $orderSn) {
Db::name('product_order_log')->where('order_id', $orderId)->update(['status' => 2]);
$this->sendLogistics($orderId, $orderSn);
}
}
//发送物流
public function sendLogistics($orderId, $orderSn)
{
Log::info("发送物流退货信息 orderId: {$orderId}, orderSn: {$orderSn}");
$postUrl = env('LOGISTICS_HOST_URL') . '/api/cancelOrder';
$curlPost = [
'order_id' => $orderId,
'order_sn' => $orderSn,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);
curl_close($ch);
Log::info("物流退货信息" . $data);
}
}

View File

@ -0,0 +1,67 @@
<?php
declare (strict_types=1);
namespace app\listener;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\model\store\order\StoreOrder;
use crmeb\services\SmsService;
use crmeb\utils\DingTalk;
use think\facade\Db;
use think\facade\Log;
class DeliveryGoods
{
public $event;
public function handle($event)
{
$this->event = $event;
Log::info("delivery ============= handle监听order_id " . $this->event['order']['order_id']);
$this->event = $event;
//发生短信包含收货码
$this->sendLogisticsCode($this->event['order']['uid'], $this->event['order']['order_id'], $this->event['order']['order_sn']);
}
public function sendLogisticsCode($uid, $orderId, $orderSn) {
//收货人短信
$phone = StoreOrder::where('order_id', $orderId)->value('user_phone');
$realName = StoreOrder::where('order_id', $orderId)->value('real_name');
if ($realName) {
$realName = $this->hidestr($realName, 1, 0);
} else {
$realName = '**';
}
$logisticsCode = StoreOrder::where('order_id', $orderId)->value('logistics_code');
$logisticsPhone = StoreOrder::where('order_id', $orderId)->value('logistics_phone');
if ($phone) {
Log::info("发送短信 {$phone}, orderId: {$orderId}");
SmsService::create()->send($phone, 'PICKUP_CODE', ['name' => $realName, 'number' => substr($orderSn, -6), 'number2' => $logisticsCode, 'phone' => $logisticsPhone ?? '']);
}
}
public function hidestr($string, $start = 0, $length = 0, $re = '*') {
if (empty($string)) return false;
$strarr = array();
$mb_strlen = mb_strlen($string);
while ($mb_strlen) {
$strarr[] = mb_substr($string, 0, 1, 'utf8');
$string = mb_substr($string, 1, $mb_strlen, 'utf8');
$mb_strlen = mb_strlen($string);
}
$strlen = count($strarr);
$begin = $start >= 0 ? $start : ($strlen - abs($start));
$end = $last = $strlen - 1;
if ($length > 0) {
$end = $begin + $length - 1;
} elseif ($length < 0) {
$end -= abs($length);
}
for ($i=$begin; $i<=$end; $i++) {
$strarr[$i] = $re;
}
if ($begin > $end || $begin > $last || $end > $last) return '';
return implode('', $strarr);
}
}

View File

@ -0,0 +1,39 @@
<?php
declare (strict_types=1);
namespace app\listener;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\store\order\StoreOrderInterestRepository;
/**
* 下单后置事件
*/
class OrderCreate
{
public function handle($event)
{
$groupOrder = $event['groupOrder'];
$order = $groupOrder->orderList[0];
if ($order['pay_type'] != StoreGroupOrder::PAY_TYPE_CREDIT_BUY || $order['activity_type'] != 98) {
return true;
}
/** @var StoreOrderInterestRepository $storeOrderInterestRepository */
$storeOrderInterestRepository = app()->make(StoreOrderInterestRepository::class);
$merchantId = Merchant::where('uid', $groupOrder['uid'])->value('mer_id');
$data = [
'group_order_id' => $groupOrder['group_order_id'],
'order_id' => $order['order_id'] ?? 0,
'mer_id' => $merchantId,
'to_mer_id' => $order['mer_id'] ?? 0,
'total_price' => $groupOrder['total_price'],
'rate' => $order['merchant']['interest_rate'] ?? 0,
'settle_cycle' => $order['merchant']['settle_cycle'] ?? 0,
];
return $storeOrderInterestRepository->create($data);
}
}

View File

@ -0,0 +1,100 @@
<?php
declare (strict_types=1);
namespace app\listener;
use app\common\repositories\store\order\StoreOrderRepository;
use crmeb\utils\DingTalk;
use think\facade\Db;
use think\facade\Log;
class SendGoodsCode
{
public $event;
public function handle($event)
{
$this->event = $event;
Log::info("sendGoodsCode ============= handle监听order_id " . $this->event['order_id']);
if ($this->event['activity_type'] == 0) {
//发起物流信息返回快递员手机
$logisticsPhone = $this->sendLogistics($this->event['order_id'], $this->event['order_sn']);
//生成用户的收货码
$this->generateLogisticsCode($this->event['uid'], $this->event['order_id'], $this->event['order_sn'], $logisticsPhone);
//记录订单收货地址记录
$this->recordOrderAddr($this->event);
}
}
//订单收货记录
public function recordOrderAddr($order) {
//province_code . city_code . district_code . street_code . village_code . brigade_id;
//设置地址信息
$addressInfo = explode(',', $order['user_address_code'] ?? '');
$productOrder = [
'uid' => $order['uid'] ?? 0,
'order_id' => $order['order_id'] ?? 0,
'province_code' => $addressInfo[0] ?? '',
'city_code' => $addressInfo[1] ?? '',
'district_code' => $addressInfo[2] ?? '',
'street_code' => $addressInfo[3] ?? '',
'village_code' => $addressInfo[4] ?? '',
'brigade_id' => $addressInfo[5] ?? 0,
'status' => 1,
'create_time' => date('Y-m-d H:i:s')
];
//商品信息
$productInfo = Db::name('store_order_product')->where('order_id', $order['order_id'] ?? 0)->find();
if ($productInfo) {
$productOrder['product_id'] = $productInfo['product_id'] ?? 0;
$productOrder['product_price'] = $productInfo['product_price'] ?? 0;
$productOrder['total_price'] = $productInfo['total_price'] ?? 0;
$productOrder['product_num'] = $productInfo['product_num'] ?? 0;
}
//商户信息
$merchantInfo = Db::name('merchant')->where('mer_id', $order['mer_id'] ?? 0)->find();
if ($merchantInfo) {
$productOrder['mer_id'] = $merchantInfo['mer_id'] ?? 0;
$productOrder['mer_category_id'] = $merchantInfo['category_id'] ?? 0;
$productOrder['mer_type_id'] = $merchantInfo['type_id'] ?? 0;
$productOrder['is_trader'] = $merchantInfo['is_trader'] ?? 0;
}
Db::name('ProductOrderLog')->insert($productOrder);
}
//用户收货码
public function generateLogisticsCode($uid, $orderId, $orderSn, $logisticsPhone) {
$code = random_int(1000, 9999);
app()->make(StoreOrderRepository::class)->update($orderId, [
'logistics_code' => $code,
'logistics_phone' => $logisticsPhone
]);
}
//发送物流
public function sendLogistics($orderId, $orderSn)
{
Log::info("发送物流信息 orderId: {$orderId}, orderSn: {$orderSn}");
$postUrl = env('LOGISTICS_HOST_URL') . '/api/lstSet';
$curlPost = [
'order_id' => $orderId,
'order_sn' => $orderSn,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);
curl_close($ch);
$phone = '';
if (!empty($data) && is_string($data)) {
$logisticsInfo = json_decode($data, true);
$phone = $logisticsInfo['data']['phone'] ?? '';
Log::info("物流联系信息" . json_encode($logisticsInfo));
}
return $phone;
}
}

View File

@ -6,6 +6,7 @@ namespace app\listener;
use app\common\dao\store\order\StoreCartDao; use app\common\dao\store\order\StoreCartDao;
use app\common\dao\system\merchant\MerchantDao; use app\common\dao\system\merchant\MerchantDao;
use app\common\model\system\merchant\Merchant; use app\common\model\system\merchant\Merchant;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\system\merchant\FinancialRecordRepository; use app\common\repositories\system\merchant\FinancialRecordRepository;
use app\common\repositories\system\merchant\MerchantRepository; use app\common\repositories\system\merchant\MerchantRepository;
use crmeb\utils\DingTalk; use crmeb\utils\DingTalk;
@ -123,7 +124,7 @@ class paySuccessOrder
]; ];
} }
if (!$financialRecordRepository->insertAll($this->finance)) { if ($financialRecordRepository->insertAll($this->finance) === false) {
throw new \Exception('财务流水保存出错'); throw new \Exception('财务流水保存出错');
} }
Db::commit(); Db::commit();

View File

@ -29,6 +29,8 @@ class MerchantUpdateValidate extends Validate
'mer_address|店铺地址' => 'require|max:128', 'mer_address|店铺地址' => 'require|max:128',
'long|店铺经度' => 'max:24', 'long|店铺经度' => 'max:24',
'lat|店铺纬度' => 'max:24', 'lat|店铺纬度' => 'max:24',
'interest_rate|利率' => 'egt:0.01|elt:0.1',
'settle_cycle|结算周期' => 'egt:15|elt:90',
]; ];
protected function isPhone($val) protected function isPhone($val)

View File

@ -55,7 +55,9 @@
"swoole/ide-helper": "^4.8", "swoole/ide-helper": "^4.8",
"alibabacloud/dysmsapi-20170525": "2.0.9", "alibabacloud/dysmsapi-20170525": "2.0.9",
"fastknife/ajcaptcha": "^1.1", "fastknife/ajcaptcha": "^1.1",
"vlucas/phpdotenv": "^5.3" "vlucas/phpdotenv": "^5.3",
"overtrue/pinyin": "4.1.0",
"jpush/jpush": "^3.6"
}, },
"require-dev": { "require-dev": {
"symfony/var-dumper": "^4.2", "symfony/var-dumper": "^4.2",

122
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "cdcb3c1e7a4e523b77afdea055928bd4", "content-hash": "2e5b7298b7a4853ac416129d0c04cb79",
"packages": [ "packages": [
{ {
"name": "adbario/php-dot-notation", "name": "adbario/php-dot-notation",
@ -1613,6 +1613,53 @@
], ],
"time": "2020-11-26T13:13:58+00:00" "time": "2020-11-26T13:13:58+00:00"
}, },
{
"name": "jpush/jpush",
"version": "v3.6.8",
"source": {
"type": "git",
"url": "https://github.com/jpush/jpush-api-php-client.git",
"reference": "ebb191e8854a35c3fb7a6626028b3a23132cbe2c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jpush/jpush-api-php-client/zipball/ebb191e8854a35c3fb7a6626028b3a23132cbe2c",
"reference": "ebb191e8854a35c3fb7a6626028b3a23132cbe2c",
"shasum": ""
},
"require": {
"ext-curl": "*",
"php": ">=5.3.3"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"type": "library",
"autoload": {
"psr-4": {
"JPush\\": "src/JPush/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "JPush",
"email": "support@jpush.cn",
"homepage": "https://www.jpush.cn/",
"role": "Developer"
}
],
"description": "JPush API PHP Client",
"homepage": "https://github.com/jpush/jpush-api-php-client",
"support": {
"issues": "https://github.com/jpush/jpush-api-php-client/issues",
"source": "https://github.com/jpush/jpush-api-php-client/tree/v3.6.8"
},
"time": "2021-08-12T07:43:39+00:00"
},
{ {
"name": "khanamiryan/qrcode-detector-decoder", "name": "khanamiryan/qrcode-detector-decoder",
"version": "1.0.3", "version": "1.0.3",
@ -2628,6 +2675,79 @@
], ],
"time": "2020-05-29T05:20:59+00:00" "time": "2020-05-29T05:20:59+00:00"
}, },
{
"name": "overtrue/pinyin",
"version": "4.1.0",
"source": {
"type": "git",
"url": "https://github.com/overtrue/pinyin.git",
"reference": "4d0fb4f27f0c79e81c9489e0c0ae4a4f8837eae7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/overtrue/pinyin/zipball/4d0fb4f27f0c79e81c9489e0c0ae4a4f8837eae7",
"reference": "4d0fb4f27f0c79e81c9489e0c0ae4a4f8837eae7",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"require-dev": {
"brainmaestro/composer-git-hooks": "^2.7",
"friendsofphp/php-cs-fixer": "^2.16",
"phpunit/phpunit": "~8.0"
},
"type": "library",
"extra": {
"hooks": {
"pre-commit": [
"composer test",
"composer fix-style"
],
"pre-push": [
"composer test",
"composer check-style"
]
}
},
"autoload": {
"files": [
"src/const.php"
],
"psr-4": {
"Overtrue\\Pinyin\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "overtrue",
"email": "anzhengchao@gmail.com",
"homepage": "http://github.com/overtrue"
}
],
"description": "Chinese to pinyin translator.",
"homepage": "https://github.com/overtrue/pinyin",
"keywords": [
"Chinese",
"Pinyin",
"cn2pinyin"
],
"support": {
"issues": "https://github.com/overtrue/pinyin/issues",
"source": "https://github.com/overtrue/pinyin/tree/4.1.0"
},
"funding": [
{
"url": "https://github.com/overtrue",
"type": "github"
}
],
"time": "2023-04-27T10:17:12+00:00"
},
{ {
"name": "overtrue/socialite", "name": "overtrue/socialite",
"version": "1.3.0", "version": "1.3.0",

View File

@ -17,7 +17,7 @@ use think\swoole\websocket\socketio\Parser;
return [ return [
'server' => [ 'server' => [
'host' => env('SWOOLE_HOST', '0.0.0.0'), // 监听地址 'host' => env('SWOOLE_HOST', '0.0.0.0'), // 监听地址
'port' => env('SWOOLE_PORT', 8324), // 监听端口 'port' => env('SWOOLE_PORT', 8325), // 监听端口
'mode' => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS 'mode' => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS
'sock_type' => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP 'sock_type' => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP
'options' => [ 'options' => [
@ -55,7 +55,7 @@ return [
'client_size' => 2048, 'client_size' => 2048,
], ],
'redis' => [ 'redis' => [
], ],
], ],
'listen' => [], 'listen' => [],

View File

@ -1,69 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\jobs;
use app\common\dao\system\serve\ServeOrderDao;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use app\common\repositories\system\serve\ServeOrderRepository;
use crmeb\interfaces\JobInterface;
use think\facade\Log;
class AutoMarginJob implements JobInterface
{
public function fire($job, $data)
{
Log::info('utoMarginStart' . var_export($data, 1));
try {
$merchant = app()->make(MerchantRepository::class)->get($data['merId']);
$orderInfo = [
'type_id' => $merchant['type_id'],
'is_margin' => $merchant['is_margin'],
'margin' => $data['margin'],
];
$values = [
'status' => 1,
'is_del' => 0,
'mer_id' => $merchant['mer_id'],
'type' => ServeOrderRepository::TYPE_MARGIN,
'meal_id'=> $merchant['type_id'],
'pay_type' => ServeOrderRepository::PAY_TYPE_BALANCE,
'order_info' => json_encode($orderInfo,JSON_UNESCAPED_UNICODE),
'pay_price' => $data['margin'],
'store_order_id' => $data['orderId'],
];
$values['order_sn'] = app()->make(StoreOrderRepository::class)->getNewOrderId('cs');
$values['pay_time'] = date('y_m-d H:i:s', time());
if (!app()->make(ServeOrderDao::class)->create($values)) {
throw new \Exception('serve_order 保存出错');
}
$merchant->paid_margin = bcadd($data['margin'], $merchant->paid_margin, 2);
$merchant->ot_margin = $merchant->paid_margin;
$merchant->is_margin = MerchantRepository::PaidMargin;
$merchant->save();
$job->delete();
} catch (\Exception $exception) {
Log::info('更新商户保证金出错:' . var_export($exception, 1));
} finally {
Log::info('autoMarginEnd' . var_export($data, 1));
}
}
public function failed($data)
{
// TODO: Implement failed() method.
}
}

View File

@ -15,9 +15,11 @@ namespace crmeb\jobs;
use app\common\repositories\system\notice\SystemNoticeConfigRepository; use app\common\repositories\system\notice\SystemNoticeConfigRepository;
use app\common\service\JgPush;
use crmeb\interfaces\JobInterface; use crmeb\interfaces\JobInterface;
use crmeb\services\SmsService; use crmeb\services\SmsService;
use crmeb\services\WechatTemplateMessageService; use crmeb\services\WechatTemplateMessageService;
use crmeb\utils\DingTalk;
use think\facade\Log; use think\facade\Log;
class SendSmsJob implements JobInterface class SendSmsJob implements JobInterface
@ -26,6 +28,20 @@ class SendSmsJob implements JobInterface
public function fire($job, $data) public function fire($job, $data)
{ {
$status = app()->make(SystemNoticeConfigRepository::class)->getNoticeStatusByConstKey($data['tempId']); $status = app()->make(SystemNoticeConfigRepository::class)->getNoticeStatusByConstKey($data['tempId']);
if (!$status) {
$job->delete();
}
if ($status['notice_app'] == 1) {
try {
/** @var JgPush $client */
$client = app()->make(JgPush::class);
Log::info('app推送发送数据' . var_export($data, 1));
$client->send($data['tempId'], $data);
} catch (\Exception $e) {
Log::info('app推送消息发送失败' . var_export($data, 1) . $e->getMessage());
DingTalk::exception($e, 'app推送消息发送失败' . var_export($data, 1));
}
}
if ($status['notice_sms'] == 1) { if ($status['notice_sms'] == 1) {
try { try {
SmsService::sendMessage($data); SmsService::sendMessage($data);

View File

@ -0,0 +1,29 @@
<?php
namespace crmeb\listens;
use app\common\model\store\order\StoreOrderInterest;
use crmeb\interfaces\ListenerInterface;
use crmeb\jobs\SendSmsJob;
use crmeb\services\TimerService;
use think\facade\Log;
use think\facade\Queue;
class AutoCheckCreditBuyListen extends TimerService implements ListenerInterface
{
public function handle($event): void
{
Log::info('credit buy listen start');
$tomorrow = strtotime('tomorrow 15:00:00');
$time = ($tomorrow - time()) * 1000;
$this->tick($time, function () {
request()->clearCache();
$time = strtotime('+3 days');
$unSettle = StoreOrderInterest::whereBetweenTime('start_time', time(), $time)->where('status', 0)->group('mer_id')->column('order_id,mer_id');
foreach ($unSettle as $item) {
Log::info('credit buy listen push job');
Queue::push(SendSmsJob::class, ['tempId' => 'MERCHANT_CREDIT_BUY_NOTICE', 'id' => $item['mer_id'], 'orderId' => $item['order_id']]);
}
});
}
}

View File

@ -0,0 +1,59 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\listens\pay;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\store\order\StoreGroupOrderRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use crmeb\interfaces\ListenerInterface;
use crmeb\utils\DingTalk;
use think\facade\Db;
use think\facade\Log;
class OrderSettlePaySuccessListen implements ListenerInterface
{
public function handle($data): void
{
Db::startTrans();
try {
$orderSn = $data['order_sn'];
$groupOrder = app()->make(StoreGroupOrderRepository::class)->getWhere(['group_order_sn' => $orderSn]);
if (!$groupOrder || !$groupOrder->interest || $groupOrder->interest->status == StoreOrderInterest::STATUS_SETTLED) {
throw new \Exception('订单无需结算');
}
/** @var StoreOrderRepository $storeOrderRepo */
$storeOrderRepo = app()->make(StoreOrderRepository::class);
$storeOrderRepo->paySuccess($groupOrder);
app()->make(MerchantRepository::class)->computedLockMoney($groupOrder->order);
$groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED;
$groupOrder->interest->settle_time = date('Y-m-d H:i:s');
if (!$groupOrder->interest->save()) {
throw new \Exception('订单结算信息保存失败');
}
//订单结算之后,修改订单支付方式为真实的支付方式
$groupOrder->pay_type = 1;
$groupOrder->save();
Db::commit();
} catch (\Exception $e) {
Db::rollback();
Log::error($e->getMessage(), $data);
DingTalk::exception($e, $e->getMessage());
}
}
}

View File

@ -322,7 +322,7 @@ class MiniProgramService
public function refund($orderNo, $refundNo, $totalFee, $refundFee = null, $opUserId = null, $refundReason = '', $type = 'out_trade_no', $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS',$openId = null, $transactionId = null) public function refund($orderNo, $refundNo, $totalFee, $refundFee = null, $opUserId = null, $refundReason = '', $type = 'out_trade_no', $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS',$openId = null, $transactionId = null)
{ {
if (empty($this->config['payment']['pay_routine_client_key']) || empty($this->config['payment']['pay_routine_client_cert'])) { if (empty($this->config['payment']['pay_routine_client_key']) || empty($this->config['payment']['pay_routine_client_cert'])) {
throw new \Exception('请配置微信支付证书'); throw new \Exception('请配置微信支付证书', 500);
} }
$totalFee = floatval($totalFee); $totalFee = floatval($totalFee);
$refundFee = floatval($refundFee); $refundFee = floatval($refundFee);

View File

@ -282,6 +282,9 @@ class SmsService
case 'SVIP_PAY_SUCCESS': case 'SVIP_PAY_SUCCESS':
self::create()->send($id['phone'], $tempId, ['store_name' => systemConfig('site_name'),'date' => $id['date']]); self::create()->send($id['phone'], $tempId, ['store_name' => systemConfig('site_name'),'date' => $id['date']]);
break; break;
case 'MERCHANT_CREDIT_BUY_NOTICE':
self::sendMerMessage($id, $tempId, ['order_id' => $data['orderId']]);
break;
} }
} }

View File

@ -520,7 +520,7 @@ class WechatService
public function refund($orderNo, $refundNo, $totalFee, $refundFee = null, $opUserId = null, $refundReason = '', $type = 'out_trade_no', $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS') public function refund($orderNo, $refundNo, $totalFee, $refundFee = null, $opUserId = null, $refundReason = '', $type = 'out_trade_no', $refundAccount = 'REFUND_SOURCE_UNSETTLED_FUNDS')
{ {
if (empty($this->config['payment']['pay_weixin_client_cert']) || empty($this->config['payment']['pay_weixin_client_key'])) { if (empty($this->config['payment']['pay_weixin_client_cert']) || empty($this->config['payment']['pay_weixin_client_key'])) {
throw new \Exception('请配置微信支付证书'); throw new \Exception('请配置微信支付证书', 500);
} }
$totalFee = floatval($totalFee); $totalFee = floatval($totalFee);
$refundFee = floatval($refundFee); $refundFee = floatval($refundFee);

View File

@ -0,0 +1,82 @@
<?php
namespace crmeb\services\payTool;
class Balance extends PayTool
{
public $order;
public function __construct()
{
}
/**
* 发起支付
* @param $order
* @return bool
* @throws \Exception
*/
public function pay($order)
{
$user = request()->userInfo();
if (!systemConfig('yue_pay_status')) {
throw new \Exception('未开启余额支付');
}
if ($user['now_money'] < $order['pay_price']) {
throw new \Exception('余额不足,请更换支付方式');
}
$user->now_money = bcsub($user->now_money, $order['pay_price'], 2);
if (!$user->save()) {
throw new \Exception('用户余额扣减失败', 500);
}
return true;
}
/**
* 查询
* @param $order
* @return string
* @throws \Exception
*/
public function query($order)
{
}
/**
* 退款
* @param $order
* @return string
* @throws \Exception
*/
public function refund($order)
{
}
/**
* 发起请求
* @param $body
* @return string
* @throws \Exception
*/
public function request($body)
{
}
public function success()
{
}
public function callback($request = null)
{
}
public function refundQuery($refundOrder)
{
}
public function transfer($withdraw)
{
}
}

View File

@ -7,21 +7,16 @@ abstract class PayTool
public $config; public $config;
public $error = ['success' => false]; public $error = ['success' => false];
const Scrcu = 'scrcu';
const ClassMap = [
self::Scrcu => Scrcu::class,
];
/** /**
* @param $name * @param $name
* @param $params * @param $params
* @return mixed|Scrcu * @return mixed|PayTool
* @throws \Exception * @throws \Exception
*/ */
public static function instance($name, $params = []) public static function instance($name, $params = [])
{ {
$class = self::ClassMap[$name]; $class = 'crmeb\services\payTool\\' . ucfirst($name);
if (class_exists($class)) { if (class_exists($class)) {
return new $class($params); return new $class($params);
} }

View File

@ -61,7 +61,7 @@ class Scrcu extends PayTool
$order['subject'] = $firstGoods->product->store_name . "{$order['total_num']}件商品"; $order['subject'] = $firstGoods->product->store_name . "{$order['total_num']}件商品";
return $order; return $order;
} catch (\Exception $e) { } catch (\Exception $e) {
throw new \Exception('商品信息错误'); throw new \Exception('商品信息错误', 500);
} }
} }

View File

@ -1,40 +1,40 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> "http://www.w3.org/TR/html4/loose.dtd">
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title> <title></title>
<style type="text/css"> <style type="text/css">
*{color: #838383;margin: 0;padding: 0} *{color: #838383;margin: 0;padding: 0}
html,body {font-size: 12px;overflow: hidden; } html,body {font-size: 12px;overflow: hidden; }
.content{padding:5px 0 0 15px;} .content{padding:5px 0 0 15px;}
input{width:210px;height:21px;line-height:21px;margin-left: 4px;} input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
</style> </style>
</head> </head>
<body> <body>
<div class="content"> <div class="content">
<span><var id="lang_input_anchorName"></var></span><input id="anchorName" value="" /> <span><var id="lang_input_anchorName"></var></span><input id="anchorName" value="" />
</div> </div>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var anchorInput = $G('anchorName'), var anchorInput = $G('anchorName'),
node = editor.selection.getRange().getClosedNode(); node = editor.selection.getRange().getClosedNode();
if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){ if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
anchorInput.value = node; anchorInput.value = node;
} }
anchorInput.onkeydown = function(evt){ anchorInput.onkeydown = function(evt){
evt = evt || window.event; evt = evt || window.event;
if(evt.keyCode == 13){ if(evt.keyCode == 13){
editor.execCommand('anchor', anchorInput.value); editor.execCommand('anchor', anchorInput.value);
dialog.close(); dialog.close();
domUtils.preventDefault(evt) domUtils.preventDefault(evt)
} }
}; };
dialog.onok = function (){ dialog.onok = function (){
editor.execCommand('anchor', anchorInput.value); editor.execCommand('anchor', anchorInput.value);
dialog.close(); dialog.close();
}; };
$focus(anchorInput); $focus(anchorInput);
</script> </script>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,60 +1,60 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>ueditor图片对话框</title> <title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<!-- jquery --> <!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
<!-- webuploader --> <!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.min.js"></script> <script src="../../third-party/webuploader/webuploader.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css"> <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
<!-- attachment dialog --> <!-- attachment dialog -->
<link rel="stylesheet" href="attachment.css" type="text/css" /> <link rel="stylesheet" href="attachment.css" type="text/css" />
</head> </head>
<body> <body>
<div class="wrapper"> <div class="wrapper">
<div id="tabhead" class="tabhead"> <div id="tabhead" class="tabhead">
<span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span> <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span> <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
</div> </div>
<div id="tabbody" class="tabbody"> <div id="tabbody" class="tabbody">
<!-- 上传图片 --> <!-- 上传图片 -->
<div id="upload" class="panel focus"> <div id="upload" class="panel focus">
<div id="queueList" class="queueList"> <div id="queueList" class="queueList">
<div class="statusBar element-invisible"> <div class="statusBar element-invisible">
<div class="progress"> <div class="progress">
<span class="text">0%</span> <span class="text">0%</span>
<span class="percentage"></span> <span class="percentage"></span>
</div><div class="info"></div> </div><div class="info"></div>
<div class="btns"> <div class="btns">
<div id="filePickerBtn"></div> <div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div> <div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div> </div>
</div> </div>
<div id="dndArea" class="placeholder"> <div id="dndArea" class="placeholder">
<div class="filePickerContainer"> <div class="filePickerContainer">
<div id="filePickerReady"></div> <div id="filePickerReady"></div>
</div> </div>
</div> </div>
<ul class="filelist element-invisible"> <ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li> <li id="filePickerBlock" class="filePickerBlock"></li>
</ul> </ul>
</div> </div>
</div> </div>
<!-- 在线图片 --> <!-- 在线图片 -->
<div id="online" class="panel"> <div id="online" class="panel">
<div id="fileList"><var id="lang_imgLoading"></var></div> <div id="fileList"><var id="lang_imgLoading"></var></div>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript" src="attachment.js"></script> <script type="text/javascript" src="attachment.js"></script>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,95 +1,95 @@
.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative} .wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
.tabbody{height:225px;} .tabbody{height:225px;}
.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;} .tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
.tabbody .focus { display: block;} .tabbody .focus { display: block;}
body{font-size: 12px;color: #888;} body{font-size: 12px;color: #888;}
/*overflow: hidden;}*/ /*overflow: hidden;}*/
input,label{vertical-align:middle} input,label{vertical-align:middle}
.clear{clear: both;} .clear{clear: both;}
.pl{padding-left: 18px;padding-left: 23px\9;} .pl{padding-left: 18px;padding-left: 23px\9;}
#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;} #imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;} #imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
#imageList img {cursor: pointer;border: 2px solid white;} #imageList img {cursor: pointer;border: 2px solid white;}
.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;} .bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
.content div{margin: 10px 0 10px 5px;} .content div{margin: 10px 0 10px 5px;}
.content .iptradio{margin: 0px 5px 5px 0px;} .content .iptradio{margin: 0px 5px 5px 0px;}
.txt{width:280px;} .txt{width:280px;}
.wrapcolor{height: 19px;} .wrapcolor{height: 19px;}
div.color{float: left;margin: 0;} div.color{float: left;margin: 0;}
#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;} #colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;} div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
#custom input{height: 15px;min-height: 15px;width:20px;} #custom input{height: 15px;min-height: 15px;width:20px;}
#repeatType{width:100px;} #repeatType{width:100px;}
/* 图片管理样式 */ /* 图片管理样式 */
#imgManager { #imgManager {
width: 100%; width: 100%;
height: 225px; height: 225px;
} }
#imgManager #imageList{ #imgManager #imageList{
width: 100%; width: 100%;
overflow-x: hidden; overflow-x: hidden;
overflow-y: auto; overflow-y: auto;
} }
#imgManager ul { #imgManager ul {
display: block; display: block;
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
#imgManager li { #imgManager li {
float: left; float: left;
display: block; display: block;
list-style: none; list-style: none;
padding: 0; padding: 0;
width: 113px; width: 113px;
height: 113px; height: 113px;
margin: 9px 0 0 19px; margin: 9px 0 0 19px;
background-color: #eee; background-color: #eee;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;
position: relative; position: relative;
} }
#imgManager li.clearFloat { #imgManager li.clearFloat {
float: none; float: none;
clear: both; clear: both;
display: block; display: block;
width:0; width:0;
height:0; height:0;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
#imgManager li img { #imgManager li img {
cursor: pointer; cursor: pointer;
} }
#imgManager li .icon { #imgManager li .icon {
cursor: pointer; cursor: pointer;
width: 113px; width: 113px;
height: 113px; height: 113px;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
z-index: 2; z-index: 2;
border: 0; border: 0;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
#imgManager li .icon:hover { #imgManager li .icon:hover {
width: 107px; width: 107px;
height: 107px; height: 107px;
border: 3px solid #1094fa; border: 3px solid #1094fa;
} }
#imgManager li.selected .icon { #imgManager li.selected .icon {
background-image: url(images/success.png); background-image: url(images/success.png);
background-position: 75px 75px; background-position: 75px 75px;
} }
#imgManager li.selected .icon:hover { #imgManager li.selected .icon:hover {
width: 107px; width: 107px;
height: 107px; height: 107px;
border: 3px solid #1094fa; border: 3px solid #1094fa;
background-position: 72px 72px; background-position: 72px 72px;
} }

View File

@ -1,56 +1,56 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="background.css"> <link rel="stylesheet" type="text/css" href="background.css">
</head> </head>
<body> <body>
<div id="bg_container" class="wrapper"> <div id="bg_container" class="wrapper">
<div id="tabHeads" class="tabhead"> <div id="tabHeads" class="tabhead">
<span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span> <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
<span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span> <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span>
</div> </div>
<div id="tabBodys" class="tabbody"> <div id="tabBodys" class="tabbody">
<div id="normal" class="panel focus"> <div id="normal" class="panel focus">
<fieldset class="bgarea"> <fieldset class="bgarea">
<legend><var id="lang_background_set"></var></legend> <legend><var id="lang_background_set"></var></legend>
<div class="content"> <div class="content">
<div> <div>
<label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label> <label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
<label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label> <label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
</div> </div>
<div class="wrapcolor pl"> <div class="wrapcolor pl">
<div class="color"> <div class="color">
<var id="lang_background_color"></var>: <var id="lang_background_color"></var>:
</div> </div>
<div id="colorPicker"></div> <div id="colorPicker"></div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div class="wrapcolor pl"> <div class="wrapcolor pl">
<label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url"> <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
</div> </div>
<div id="alignment" class="alignment"> <div id="alignment" class="alignment">
<var id="lang_background_align"></var>:<select id="repeatType"> <var id="lang_background_align"></var>:<select id="repeatType">
<option value="center"></option> <option value="center"></option>
<option value="repeat-x"></option> <option value="repeat-x"></option>
<option value="repeat-y"></option> <option value="repeat-y"></option>
<option value="repeat"></option> <option value="repeat"></option>
<option value="self"></option> <option value="self"></option>
</select> </select>
</div> </div>
<div id="custom" > <div id="custom" >
<var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
</div> </div>
</div> </div>
</fieldset> </fieldset>
</div> </div>
<div id="imgManager" class="panel"> <div id="imgManager" class="panel">
<div id="imageList" style=""></div> <div id="imageList" style=""></div>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript" src="background.js"></script> <script type="text/javascript" src="background.js"></script>
</body> </body>
</html> </html>

View File

@ -1,376 +1,376 @@
(function () { (function () {
var onlineImage, var onlineImage,
backupStyle = editor.queryCommandValue('background'); backupStyle = editor.queryCommandValue('background');
window.onload = function () { window.onload = function () {
initTabs(); initTabs();
initColorSelector(); initColorSelector();
}; };
/* 初始化tab标签 */ /* 初始化tab标签 */
function initTabs(){ function initTabs(){
var tabs = $G('tabHeads').children; var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) { for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) { domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement; var target = e.target || e.srcElement;
for (var j = 0; j < tabs.length; j++) { for (var j = 0; j < tabs.length; j++) {
if(tabs[j] == target){ if(tabs[j] == target){
tabs[j].className = "focus"; tabs[j].className = "focus";
var contentId = tabs[j].getAttribute('data-content-id'); var contentId = tabs[j].getAttribute('data-content-id');
$G(contentId).style.display = "block"; $G(contentId).style.display = "block";
if(contentId == 'imgManager') { if(contentId == 'imgManager') {
initImagePanel(); initImagePanel();
} }
}else { }else {
tabs[j].className = ""; tabs[j].className = "";
$G(tabs[j].getAttribute('data-content-id')).style.display = "none"; $G(tabs[j].getAttribute('data-content-id')).style.display = "none";
} }
} }
}); });
} }
} }
/* 初始化颜色设置 */ /* 初始化颜色设置 */
function initColorSelector () { function initColorSelector () {
var obj = editor.queryCommandValue('background'); var obj = editor.queryCommandValue('background');
if (obj) { if (obj) {
var color = obj['background-color'], var color = obj['background-color'],
repeat = obj['background-repeat'] || 'repeat', repeat = obj['background-repeat'] || 'repeat',
image = obj['background-image'] || '', image = obj['background-image'] || '',
position = obj['background-position'] || 'center center', position = obj['background-position'] || 'center center',
pos = position.split(' '), pos = position.split(' '),
x = parseInt(pos[0]) || 0, x = parseInt(pos[0]) || 0,
y = parseInt(pos[1]) || 0; y = parseInt(pos[1]) || 0;
if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
image = image.match(/url[\s]*\(([^\)]*)\)/); image = image.match(/url[\s]*\(([^\)]*)\)/);
image = image ? image[1]:''; image = image ? image[1]:'';
updateFormState('colored', color, image, repeat, x, y); updateFormState('colored', color, image, repeat, x, y);
} else { } else {
updateFormState(); updateFormState();
} }
var updateHandler = function () { var updateHandler = function () {
updateFormState(); updateFormState();
updateBackground(); updateBackground();
} }
domUtils.on($G('nocolorRadio'), 'click', updateBackground); domUtils.on($G('nocolorRadio'), 'click', updateBackground);
domUtils.on($G('coloredRadio'), 'click', updateHandler); domUtils.on($G('coloredRadio'), 'click', updateHandler);
domUtils.on($G('url'), 'keyup', function(){ domUtils.on($G('url'), 'keyup', function(){
if($G('url').value && $G('alignment').style.display == "none") { if($G('url').value && $G('alignment').style.display == "none") {
utils.each($G('repeatType').children, function(item){ utils.each($G('repeatType').children, function(item){
item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
}); });
} }
updateHandler(); updateHandler();
}); });
domUtils.on($G('repeatType'), 'change', updateHandler); domUtils.on($G('repeatType'), 'change', updateHandler);
domUtils.on($G('x'), 'keyup', updateBackground); domUtils.on($G('x'), 'keyup', updateBackground);
domUtils.on($G('y'), 'keyup', updateBackground); domUtils.on($G('y'), 'keyup', updateBackground);
initColorPicker(); initColorPicker();
} }
/* 初始化颜色选择器 */ /* 初始化颜色选择器 */
function initColorPicker() { function initColorPicker() {
var me = editor, var me = editor,
cp = $G("colorPicker"); cp = $G("colorPicker");
/* 生成颜色选择器ui对象 */ /* 生成颜色选择器ui对象 */
var popup = new UE.ui.Popup({ var popup = new UE.ui.Popup({
content: new UE.ui.ColorPicker({ content: new UE.ui.ColorPicker({
noColorText: me.getLang("clearColor"), noColorText: me.getLang("clearColor"),
editor: me, editor: me,
onpickcolor: function (t, color) { onpickcolor: function (t, color) {
updateFormState('colored', color); updateFormState('colored', color);
updateBackground(); updateBackground();
UE.ui.Popup.postHide(); UE.ui.Popup.postHide();
}, },
onpicknocolor: function (t, color) { onpicknocolor: function (t, color) {
updateFormState('colored', 'transparent'); updateFormState('colored', 'transparent');
updateBackground(); updateBackground();
UE.ui.Popup.postHide(); UE.ui.Popup.postHide();
} }
}), }),
editor: me, editor: me,
onhide: function () { onhide: function () {
} }
}); });
/* 设置颜色选择器 */ /* 设置颜色选择器 */
domUtils.on(cp, "click", function () { domUtils.on(cp, "click", function () {
popup.showAnchor(this); popup.showAnchor(this);
}); });
domUtils.on(document, 'mousedown', function (evt) { domUtils.on(document, 'mousedown', function (evt) {
var el = evt.target || evt.srcElement; var el = evt.target || evt.srcElement;
UE.ui.Popup.postHide(el); UE.ui.Popup.postHide(el);
}); });
domUtils.on(window, 'scroll', function () { domUtils.on(window, 'scroll', function () {
UE.ui.Popup.postHide(); UE.ui.Popup.postHide();
}); });
} }
/* 初始化在线图片列表 */ /* 初始化在线图片列表 */
function initImagePanel() { function initImagePanel() {
onlineImage = onlineImage || new OnlineImage('imageList'); onlineImage = onlineImage || new OnlineImage('imageList');
} }
/* 更新背景色设置面板 */ /* 更新背景色设置面板 */
function updateFormState (radio, color, url, align, x, y) { function updateFormState (radio, color, url, align, x, y) {
var nocolorRadio = $G('nocolorRadio'), var nocolorRadio = $G('nocolorRadio'),
coloredRadio = $G('coloredRadio'); coloredRadio = $G('coloredRadio');
if(radio) { if(radio) {
nocolorRadio.checked = (radio == 'colored' ? false:'checked'); nocolorRadio.checked = (radio == 'colored' ? false:'checked');
coloredRadio.checked = (radio == 'colored' ? 'checked':false); coloredRadio.checked = (radio == 'colored' ? 'checked':false);
} }
if(color) { if(color) {
domUtils.setStyle($G("colorPicker"), "background-color", color); domUtils.setStyle($G("colorPicker"), "background-color", color);
} }
if(url && /^\//.test(url)) { if(url && /^\//.test(url)) {
var a = document.createElement('a'); var a = document.createElement('a');
a.href = url; a.href = url;
browser.ie && (a.href = a.href); browser.ie && (a.href = a.href);
url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
} }
if(url || url === '') { if(url || url === '') {
$G('url').value = url; $G('url').value = url;
} }
if(align) { if(align) {
utils.each($G('repeatType').children, function(item){ utils.each($G('repeatType').children, function(item){
item.selected = (align == item.getAttribute('value') ? 'selected':false); item.selected = (align == item.getAttribute('value') ? 'selected':false);
}); });
} }
if(x || y) { if(x || y) {
$G('x').value = parseInt(x) || 0; $G('x').value = parseInt(x) || 0;
$G('y').value = parseInt(y) || 0; $G('y').value = parseInt(y) || 0;
} }
$G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
$G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
} }
/* 更新背景颜色 */ /* 更新背景颜色 */
function updateBackground () { function updateBackground () {
if ($G('coloredRadio').checked) { if ($G('coloredRadio').checked) {
var color = domUtils.getStyle($G("colorPicker"), "background-color"), var color = domUtils.getStyle($G("colorPicker"), "background-color"),
bgimg = $G("url").value, bgimg = $G("url").value,
align = $G("repeatType").value, align = $G("repeatType").value,
backgroundObj = { backgroundObj = {
"background-repeat": "no-repeat", "background-repeat": "no-repeat",
"background-position": "center center" "background-position": "center center"
}; };
if (color) backgroundObj["background-color"] = color; if (color) backgroundObj["background-color"] = color;
if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
if (align == 'self') { if (align == 'self') {
backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
} else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
backgroundObj["background-repeat"] = align; backgroundObj["background-repeat"] = align;
} }
editor.execCommand('background', backgroundObj); editor.execCommand('background', backgroundObj);
} else { } else {
editor.execCommand('background', null); editor.execCommand('background', null);
} }
} }
/* 在线图片 */ /* 在线图片 */
function OnlineImage(target) { function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target; this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init(); this.init();
} }
OnlineImage.prototype = { OnlineImage.prototype = {
init: function () { init: function () {
this.reset(); this.reset();
this.initEvents(); this.initEvents();
}, },
/* 初始化容器 */ /* 初始化容器 */
initContainer: function () { initContainer: function () {
this.container.innerHTML = ''; this.container.innerHTML = '';
this.list = document.createElement('ul'); this.list = document.createElement('ul');
this.clearFloat = document.createElement('li'); this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list'); domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat'); domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.id = 'imageListUl'; this.list.id = 'imageListUl';
this.list.appendChild(this.clearFloat); this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list); this.container.appendChild(this.list);
}, },
/* 初始化滚动事件,滚动到地步自动拉取数据 */ /* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () { initEvents: function () {
var _this = this; var _this = this;
/* 滚动拉取图片 */ /* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function(e){ domUtils.on($G('imageList'), 'scroll', function(e){
var panel = this; var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData(); _this.getImageData();
} }
}); });
/* 选中图片 */ /* 选中图片 */
domUtils.on(this.container, 'click', function (e) { domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement, var target = e.target || e.srcElement,
li = target.parentNode, li = target.parentNode,
nodes = $G('imageListUl').childNodes; nodes = $G('imageListUl').childNodes;
if (li.tagName.toLowerCase() == 'li') { if (li.tagName.toLowerCase() == 'li') {
updateFormState('nocolor', null, ''); updateFormState('nocolor', null, '');
for (var i = 0, node; node = nodes[i++];) { for (var i = 0, node; node = nodes[i++];) {
if (node == li && !domUtils.hasClass(node, 'selected')) { if (node == li && !domUtils.hasClass(node, 'selected')) {
domUtils.addClass(node, 'selected'); domUtils.addClass(node, 'selected');
updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
} else { } else {
domUtils.removeClasses(node, 'selected'); domUtils.removeClasses(node, 'selected');
} }
} }
updateBackground(); updateBackground();
} }
}); });
}, },
/* 初始化第一次的数据 */ /* 初始化第一次的数据 */
initData: function () { initData: function () {
/* 拉取数据需要使用的值 */ /* 拉取数据需要使用的值 */
this.state = 0; this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize'); this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0; this.listIndex = 0;
this.listEnd = false; this.listEnd = false;
/* 第一次拉取数据 */ /* 第一次拉取数据 */
this.getImageData(); this.getImageData();
}, },
/* 重置界面 */ /* 重置界面 */
reset: function() { reset: function() {
this.initContainer(); this.initContainer();
this.initData(); this.initData();
}, },
/* 向后台拉取图片列表数据 */ /* 向后台拉取图片列表数据 */
getImageData: function () { getImageData: function () {
var _this = this; var _this = this;
if(!_this.listEnd && !this.isLoadingData) { if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true; this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url); isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, { ajax.request(url, {
'timeout': 100000, 'timeout': 100000,
'dataType': isJsonp ? 'jsonp':'', 'dataType': isJsonp ? 'jsonp':'',
'data': utils.extend({ 'data': utils.extend({
start: this.listIndex, start: this.listIndex,
size: this.listSize size: this.listSize
}, editor.queryCommandValue('serverparam')), }, editor.queryCommandValue('serverparam')),
'method': 'get', 'method': 'get',
'onsuccess': function (r) { 'onsuccess': function (r) {
try { try {
var json = isJsonp ? r:eval('(' + r.responseText + ')'); var json = isJsonp ? r:eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') { if (json.state == 'SUCCESS') {
_this.pushData(json.list); _this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length); _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) { if(_this.listIndex >= json.total) {
_this.listEnd = true; _this.listEnd = true;
} }
_this.isLoadingData = false; _this.isLoadingData = false;
} }
} catch (e) { } catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) { if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText); var list = r.responseText.split(r.responseText);
_this.pushData(list); _this.pushData(list);
_this.listIndex = parseInt(list.length); _this.listIndex = parseInt(list.length);
_this.listEnd = true; _this.listEnd = true;
_this.isLoadingData = false; _this.isLoadingData = false;
} }
} }
}, },
'onerror': function () { 'onerror': function () {
_this.isLoadingData = false; _this.isLoadingData = false;
} }
}); });
} }
}, },
/* 添加图片到列表界面上 */ /* 添加图片到列表界面上 */
pushData: function (list) { pushData: function (list) {
var i, item, img, icon, _this = this, var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix'); urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) { for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) { if(list[i] && list[i].url) {
item = document.createElement('li'); item = document.createElement('li');
img = document.createElement('img'); img = document.createElement('img');
icon = document.createElement('span'); icon = document.createElement('span');
domUtils.on(img, 'load', (function(image){ domUtils.on(img, 'load', (function(image){
return function(){ return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
} }
})(img)); })(img));
img.width = 113; img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
img.setAttribute('_src', urlPrefix + list[i].url); img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon'); domUtils.addClass(icon, 'icon');
item.appendChild(img); item.appendChild(img);
item.appendChild(icon); item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat); this.list.insertBefore(item, this.clearFloat);
} }
} }
}, },
/* 改变图片大小 */ /* 改变图片大小 */
scale: function (img, w, h, type) { scale: function (img, w, h, type) {
var ow = img.width, var ow = img.width,
oh = img.height; oh = img.height;
if (type == 'justify') { if (type == 'justify') {
if (ow >= oh) { if (ow >= oh) {
img.width = w; img.width = w;
img.height = h * oh / ow; img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else { } else {
img.width = w * ow / oh; img.width = w * ow / oh;
img.height = h; img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
} }
} else { } else {
if (ow >= oh) { if (ow >= oh) {
img.width = w * ow / oh; img.width = w * ow / oh;
img.height = h; img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else { } else {
img.width = w; img.width = w;
img.height = h * oh / ow; img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
} }
} }
}, },
getInsertList: function () { getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign(); var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) { for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) { if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild, var img = lis[i].firstChild,
src = img.getAttribute('_src'); src = img.getAttribute('_src');
list.push({ list.push({
src: src, src: src,
_src: src, _src: src,
floatStyle: align floatStyle: align
}); });
} }
} }
return list; return list;
} }
}; };
dialog.onok = function () { dialog.onok = function () {
updateBackground(); updateBackground();
editor.fireEvent('saveScene'); editor.fireEvent('saveScene');
}; };
dialog.oncancel = function () { dialog.oncancel = function () {
editor.execCommand('background', backupStyle); editor.execCommand('background', backupStyle);
}; };
})(); })();

View File

@ -1,65 +1,65 @@
/* /*
* 图表配置文件 * 图表配置文件
* */ * */
//不同类型的配置 //不同类型的配置
var typeConfig = [ var typeConfig = [
{ {
chart: { chart: {
type: 'line' type: 'line'
}, },
plotOptions: { plotOptions: {
line: { line: {
dataLabels: { dataLabels: {
enabled: false enabled: false
}, },
enableMouseTracking: true enableMouseTracking: true
} }
} }
}, { }, {
chart: { chart: {
type: 'line' type: 'line'
}, },
plotOptions: { plotOptions: {
line: { line: {
dataLabels: { dataLabels: {
enabled: true enabled: true
}, },
enableMouseTracking: false enableMouseTracking: false
} }
} }
}, { }, {
chart: { chart: {
type: 'area' type: 'area'
} }
}, { }, {
chart: { chart: {
type: 'bar' type: 'bar'
} }
}, { }, {
chart: { chart: {
type: 'column' type: 'column'
} }
}, { }, {
chart: { chart: {
plotBackgroundColor: null, plotBackgroundColor: null,
plotBorderWidth: null, plotBorderWidth: null,
plotShadow: false plotShadow: false
}, },
plotOptions: { plotOptions: {
pie: { pie: {
allowPointSelect: true, allowPointSelect: true,
cursor: 'pointer', cursor: 'pointer',
dataLabels: { dataLabels: {
enabled: true, enabled: true,
color: '#000000', color: '#000000',
connectorColor: '#000000', connectorColor: '#000000',
formatter: function() { formatter: function() {
return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
} }
} }
} }
} }
} }
]; ];

View File

@ -1,165 +1,165 @@
html, body { html, body {
width: 100%; width: 100%;
height: 100%; height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
overflow-x: hidden; overflow-x: hidden;
} }
.main { .main {
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
} }
.table-view { .table-view {
height: 100%; height: 100%;
float: left; float: left;
margin: 20px; margin: 20px;
width: 40%; width: 40%;
} }
.table-view .table-container { .table-view .table-container {
width: 100%; width: 100%;
margin-bottom: 50px; margin-bottom: 50px;
overflow: scroll; overflow: scroll;
} }
.table-view th { .table-view th {
padding: 5px 10px; padding: 5px 10px;
background-color: #F7F7F7; background-color: #F7F7F7;
} }
.table-view td { .table-view td {
width: 50px; width: 50px;
text-align: center; text-align: center;
padding:0; padding:0;
} }
.table-container input { .table-container input {
width: 40px; width: 40px;
padding: 5px; padding: 5px;
border: none; border: none;
outline: none; outline: none;
} }
.table-view caption { .table-view caption {
font-size: 18px; font-size: 18px;
text-align: left; text-align: left;
} }
.charts-view { .charts-view {
/*margin-left: 49%!important;*/ /*margin-left: 49%!important;*/
width: 50%; width: 50%;
margin-left: 49%; margin-left: 49%;
height: 400px; height: 400px;
} }
.charts-container { .charts-container {
border-left: 1px solid #c3c3c3; border-left: 1px solid #c3c3c3;
} }
.charts-format fieldset { .charts-format fieldset {
padding-left: 20px; padding-left: 20px;
margin-bottom: 50px; margin-bottom: 50px;
} }
.charts-format legend { .charts-format legend {
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
} }
.format-item-container { .format-item-container {
padding: 20px; padding: 20px;
} }
.format-item-container label { .format-item-container label {
display: block; display: block;
margin: 10px 0; margin: 10px 0;
} }
.charts-format .data-item { .charts-format .data-item {
border: 1px solid black; border: 1px solid black;
outline: none; outline: none;
padding: 2px 3px; padding: 2px 3px;
} }
/* 图表类型 */ /* 图表类型 */
.charts-type { .charts-type {
margin-top: 50px; margin-top: 50px;
height: 300px; height: 300px;
} }
.scroll-view { .scroll-view {
border: 1px solid #c3c3c3; border: 1px solid #c3c3c3;
border-left: none; border-left: none;
border-right: none; border-right: none;
overflow: hidden; overflow: hidden;
} }
.scroll-container { .scroll-container {
margin: 20px; margin: 20px;
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
} }
.scroll-bed { .scroll-bed {
width: 10000px; width: 10000px;
_margin-top: 20px; _margin-top: 20px;
-webkit-transition: margin-left .5s ease; -webkit-transition: margin-left .5s ease;
-moz-transition: margin-left .5s ease; -moz-transition: margin-left .5s ease;
transition: margin-left .5s ease; transition: margin-left .5s ease;
} }
.view-box { .view-box {
display: inline-block; display: inline-block;
*display: inline; *display: inline;
*zoom: 1; *zoom: 1;
margin-right: 20px; margin-right: 20px;
border: 2px solid white; border: 2px solid white;
line-height: 0; line-height: 0;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;
} }
.view-box img { .view-box img {
border: 1px solid #cecece; border: 1px solid #cecece;
} }
.view-box.selected { .view-box.selected {
border-color: #7274A7; border-color: #7274A7;
} }
.button-container { .button-container {
margin-bottom: 20px; margin-bottom: 20px;
text-align: center; text-align: center;
} }
.button-container a { .button-container a {
display: inline-block; display: inline-block;
width: 100px; width: 100px;
height: 25px; height: 25px;
line-height: 25px; line-height: 25px;
border: 1px solid #c2ccd1; border: 1px solid #c2ccd1;
margin-right: 30px; margin-right: 30px;
text-decoration: none; text-decoration: none;
color: black; color: black;
-webkit-border-radius: 2px; -webkit-border-radius: 2px;
-moz-border-radius: 2px; -moz-border-radius: 2px;
border-radius: 2px; border-radius: 2px;
} }
.button-container a:HOVER { .button-container a:HOVER {
background: #fcfcfc; background: #fcfcfc;
} }
.button-container a:ACTIVE { .button-container a:ACTIVE {
border-top-color: #c2ccd1; border-top-color: #c2ccd1;
box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
} }
.edui-charts-not-data { .edui-charts-not-data {
height: 100px; height: 100px;
line-height: 100px; line-height: 100px;
text-align: center; text-align: center;
} }

View File

@ -1,89 +1,89 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>chart</title> <title>chart</title>
<meta chartset="utf-8"> <meta chartset="utf-8">
<link rel="stylesheet" type="text/css" href="charts.css"> <link rel="stylesheet" type="text/css" href="charts.css">
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
</head> </head>
<body> <body>
<div class="main"> <div class="main">
<div class="table-view"> <div class="table-view">
<h3><var id="lang_data_source"></var></h3> <h3><var id="lang_data_source"></var></h3>
<div id="tableContainer" class="table-container"></div> <div id="tableContainer" class="table-container"></div>
<h3><var id="lang_chart_format"></var></h3> <h3><var id="lang_chart_format"></var></h3>
<form name="data-form"> <form name="data-form">
<div class="charts-format"> <div class="charts-format">
<fieldset> <fieldset>
<legend><var id="lang_data_align"></var></legend> <legend><var id="lang_data_align"></var></legend>
<div class="format-item-container"> <div class="format-item-container">
<label> <label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked"> <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
<var id="lang_chart_align_same"></var> <var id="lang_chart_align_same"></var>
</label> </label>
<label> <label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1"> <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
<var id="lang_chart_align_reverse"></var> <var id="lang_chart_align_reverse"></var>
</label> </label>
<br> <br>
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend><var id="lang_chart_title"></var></legend> <legend><var id="lang_chart_title"></var></legend>
<div class="format-item-container"> <div class="format-item-container">
<label> <label>
<var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item"> <var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
</label> </label>
<label> <label>
<var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item"> <var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
</label> </label>
<label> <label>
<var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item"> <var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
</label> </label>
<label> <label>
<var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item"> <var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
</label> </label>
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend><var id="lang_chart_tip"></var></legend> <legend><var id="lang_chart_tip"></var></legend>
<div class="format-item-container"> <div class="format-item-container">
<label> <label>
<var id="lang_cahrt_tip_prefix"></var> <var id="lang_cahrt_tip_prefix"></var>
<input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled"> <input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
</label> </label>
<p><var id="lang_cahrt_tip_description"></var></p> <p><var id="lang_cahrt_tip_description"></var></p>
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend><var id="lang_chart_data_unit"></var></legend> <legend><var id="lang_chart_data_unit"></var></legend>
<div class="format-item-container"> <div class="format-item-container">
<label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label> <label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
<p><var id="lang_chart_data_unit_description"></var></p> <p><var id="lang_chart_data_unit_description"></var></p>
</div> </div>
</fieldset> </fieldset>
</div> </div>
</form> </form>
</div> </div>
<div class="charts-view"> <div class="charts-view">
<div id="chartsContainer" class="charts-container"></div> <div id="chartsContainer" class="charts-container"></div>
<div id="chartsType" class="charts-type"> <div id="chartsType" class="charts-type">
<h3><var id="lang_chart_type"></var></h3> <h3><var id="lang_chart_type"></var></h3>
<div class="scroll-view"> <div class="scroll-view">
<div class="scroll-container"> <div class="scroll-container">
<div id="scrollBed" class="scroll-bed"></div> <div id="scrollBed" class="scroll-bed"></div>
</div> </div>
<div id="buttonContainer" class="button-container"> <div id="buttonContainer" class="button-container">
<a href="#" data-title="prev"><var id="lang_prev_btn"></var></a> <a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
<a href="#" data-title="next"><var id="lang_next_btn"></var></a> <a href="#" data-title="next"><var id="lang_next_btn"></var></a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script src="../../third-party/jquery-1.10.2.min.js"></script> <script src="../../third-party/jquery-1.10.2.min.js"></script>
<script src="../../third-party/highcharts/highcharts.js"></script> <script src="../../third-party/highcharts/highcharts.js"></script>
<script src="chart.config.js"></script> <script src="chart.config.js"></script>
<script src="charts.js"></script> <script src="charts.js"></script>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +1,43 @@
.jd img{ .jd img{
background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.pp img{ .pp img{
background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:25px;height:25px;display:block; cursor:pointer;width:25px;height:25px;display:block;
} }
.ldw img{ .ldw img{
background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.tsj img{ .tsj img{
background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.cat img{ .cat img{
background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.bb img{ .bb img{
background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.youa img{ .youa img{
background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block; cursor:pointer;width:35px;height:35px;display:block;
} }
.smileytable td {height: 37px;} .smileytable td {height: 37px;}
#tabPanel{margin-left:5px;overflow: hidden;} #tabPanel{margin-left:5px;overflow: hidden;}
#tabContent {float:left;background:#FFFFFF;} #tabContent {float:left;background:#FFFFFF;}
#tabContent div{display: none;width:480px;overflow:hidden;} #tabContent div{display: none;width:480px;overflow:hidden;}
#tabIconReview.show{left:17px;display:block;} #tabIconReview.show{left:17px;display:block;}
.menuFocus{background:#ACCD3C;} .menuFocus{background:#ACCD3C;}
.menuDefault{background:#FFFFFF;} .menuDefault{background:#FFFFFF;}
#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} #tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} .wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
.tabbody table{width: 100%;} .tabbody table{width: 100%;}
.tabbody td{border:1px solid #BAC498;} .tabbody td{border:1px solid #BAC498;}
.tabbody td span{display: block;zoom:1;padding:0 4px;} .tabbody td span{display: block;zoom:1;padding:0 4px;}

View File

@ -1,54 +1,54 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title></title> <title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="noindex, nofollow"/> <meta name="robots" content="noindex, nofollow"/>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="emotion.css"> <link rel="stylesheet" type="text/css" href="emotion.css">
</head> </head>
<body> <body>
<div id="tabPanel" class="wrapper"> <div id="tabPanel" class="wrapper">
<div id="tabHeads" class="tabhead"> <div id="tabHeads" class="tabhead">
<span><var id="lang_input_choice"></var></span> <span><var id="lang_input_choice"></var></span>
<span><var id="lang_input_Tuzki"></var></span> <span><var id="lang_input_Tuzki"></var></span>
<span><var id="lang_input_lvdouwa"></var></span> <span><var id="lang_input_lvdouwa"></var></span>
<span><var id="lang_input_BOBO"></var></span> <span><var id="lang_input_BOBO"></var></span>
<span><var id="lang_input_babyCat"></var></span> <span><var id="lang_input_babyCat"></var></span>
<span><var id="lang_input_bubble"></var></span> <span><var id="lang_input_bubble"></var></span>
<span><var id="lang_input_youa"></var></span> <span><var id="lang_input_youa"></var></span>
</div> </div>
<div id="tabBodys" class="tabbody"> <div id="tabBodys" class="tabbody">
<div id="tab0"></div> <div id="tab0"></div>
<div id="tab1"></div> <div id="tab1"></div>
<div id="tab2"></div> <div id="tab2"></div>
<div id="tab3"></div> <div id="tab3"></div>
<div id="tab4"></div> <div id="tab4"></div>
<div id="tab5"></div> <div id="tab5"></div>
<div id="tab6"></div> <div id="tab6"></div>
</div> </div>
</div> </div>
<div id="tabIconReview"> <div id="tabIconReview">
<img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/> <img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
</div> </div>
<script type="text/javascript" src="emotion.js"></script> <script type="text/javascript" src="emotion.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var emotion = { var emotion = {
tabNum:7, //切换面板数量 tabNum:7, //切换面板数量
SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名 SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径 imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名 imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移 imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
SmileyInfor:{ SmileyInfor:{
tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'], tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'], tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'], tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'], tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'], tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'], tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上'] tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
} }
}; };
</script> </script>
</body> </body>
</html> </html>

View File

@ -1,186 +1,186 @@
window.onload = function () { window.onload = function () {
editor.setOpt({ editor.setOpt({
emotionLocalization:false emotionLocalization:false
}); });
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/";
emotion.SmileyBox = createTabList( emotion.tabNum ); emotion.SmileyBox = createTabList( emotion.tabNum );
emotion.tabExist = createArr( emotion.tabNum ); emotion.tabExist = createArr( emotion.tabNum );
initImgName(); initImgName();
initEvtHandler( "tabHeads" ); initEvtHandler( "tabHeads" );
}; };
function initImgName() { function initImgName() {
for ( var pro in emotion.SmilmgName ) { for ( var pro in emotion.SmilmgName ) {
var tempName = emotion.SmilmgName[pro], var tempName = emotion.SmilmgName[pro],
tempBox = emotion.SmileyBox[pro], tempBox = emotion.SmileyBox[pro],
tempStr = ""; tempStr = "";
if ( tempBox.length ) return; if ( tempBox.length ) return;
for ( var i = 1; i <= tempName[1]; i++ ) { for ( var i = 1; i <= tempName[1]; i++ ) {
tempStr = tempName[0]; tempStr = tempName[0];
if ( i < 10 ) tempStr = tempStr + '0'; if ( i < 10 ) tempStr = tempStr + '0';
tempStr = tempStr + i + '.gif'; tempStr = tempStr + i + '.gif';
tempBox.push( tempStr ); tempBox.push( tempStr );
} }
} }
} }
function initEvtHandler( conId ) { function initEvtHandler( conId ) {
var tabHeads = $G( conId ); var tabHeads = $G( conId );
for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
var tabObj = tabHeads.childNodes[i]; var tabObj = tabHeads.childNodes[i];
if ( tabObj.nodeType == 1 ) { if ( tabObj.nodeType == 1 ) {
domUtils.on( tabObj, "click", (function ( index ) { domUtils.on( tabObj, "click", (function ( index ) {
return function () { return function () {
switchTab( index ); switchTab( index );
}; };
})( j ) ); })( j ) );
j++; j++;
} }
} }
switchTab( 0 ); switchTab( 0 );
$G( "tabIconReview" ).style.display = 'none'; $G( "tabIconReview" ).style.display = 'none';
} }
function InsertSmiley( url, evt ) { function InsertSmiley( url, evt ) {
var obj = { var obj = {
src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
}; };
obj._src = obj.src; obj._src = obj.src;
editor.execCommand( 'insertimage', obj ); editor.execCommand( 'insertimage', obj );
if ( !evt.ctrlKey ) { if ( !evt.ctrlKey ) {
dialog.popup.hide(); dialog.popup.hide();
} }
} }
function switchTab( index ) { function switchTab( index ) {
autoHeight( index ); autoHeight( index );
if ( emotion.tabExist[index] == 0 ) { if ( emotion.tabExist[index] == 0 ) {
emotion.tabExist[index] = 1; emotion.tabExist[index] = 1;
createTab( 'tab' + index ); createTab( 'tab' + index );
} }
//获取呈现元素句柄数组 //获取呈现元素句柄数组
var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
i = 0, L = tabHeads.length; i = 0, L = tabHeads.length;
//隐藏所有呈现元素 //隐藏所有呈现元素
for ( ; i < L; i++ ) { for ( ; i < L; i++ ) {
tabHeads[i].className = ""; tabHeads[i].className = "";
tabBodys[i].style.display = "none"; tabBodys[i].style.display = "none";
} }
//显示对应呈现元素 //显示对应呈现元素
tabHeads[index].className = "focus"; tabHeads[index].className = "focus";
tabBodys[index].style.display = "block"; tabBodys[index].style.display = "block";
} }
function autoHeight( index ) { function autoHeight( index ) {
var iframe = dialog.getDom( "iframe" ), var iframe = dialog.getDom( "iframe" ),
parent = iframe.parentNode.parentNode; parent = iframe.parentNode.parentNode;
switch ( index ) { switch ( index ) {
case 0: case 0:
iframe.style.height = "380px"; iframe.style.height = "380px";
parent.style.height = "392px"; parent.style.height = "392px";
break; break;
case 1: case 1:
iframe.style.height = "220px"; iframe.style.height = "220px";
parent.style.height = "232px"; parent.style.height = "232px";
break; break;
case 2: case 2:
iframe.style.height = "260px"; iframe.style.height = "260px";
parent.style.height = "272px"; parent.style.height = "272px";
break; break;
case 3: case 3:
iframe.style.height = "300px"; iframe.style.height = "300px";
parent.style.height = "312px"; parent.style.height = "312px";
break; break;
case 4: case 4:
iframe.style.height = "140px"; iframe.style.height = "140px";
parent.style.height = "152px"; parent.style.height = "152px";
break; break;
case 5: case 5:
iframe.style.height = "260px"; iframe.style.height = "260px";
parent.style.height = "272px"; parent.style.height = "272px";
break; break;
case 6: case 6:
iframe.style.height = "230px"; iframe.style.height = "230px";
parent.style.height = "242px"; parent.style.height = "242px";
break; break;
default: default:
} }
} }
function createTab( tabName ) { function createTab( tabName ) {
var faceVersion = "?v=1.1", //版本号 var faceVersion = "?v=1.1", //版本号
tab = $G( tabName ), //获取将要生成的Div句柄 tab = $G( tabName ), //获取将要生成的Div句柄
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
positionLine = 11 / 2, //中间数 positionLine = 11 / 2, //中间数
iWidth = iHeight = 35, //图片长宽 iWidth = iHeight = 35, //图片长宽
iColWidth = 3, //表格剩余空间的显示比例 iColWidth = 3, //表格剩余空间的显示比例
tableCss = emotion.imageCss[tabName], tableCss = emotion.imageCss[tabName],
cssOffset = emotion.imageCssOffset[tabName], cssOffset = emotion.imageCssOffset[tabName],
textHTML = ['<table class="smileytable">'], textHTML = ['<table class="smileytable">'],
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
sUrl, realUrl, posflag, offset, infor; sUrl, realUrl, posflag, offset, infor;
for ( ; i < imgNum; ) { for ( ; i < imgNum; ) {
textHTML.push( '<tr>' ); textHTML.push( '<tr>' );
for ( var j = 0; j < imgColNum; j++, i++ ) { for ( var j = 0; j < imgColNum; j++, i++ ) {
faceImage = emotion.SmileyBox[tabName][i]; faceImage = emotion.SmileyBox[tabName][i];
if ( faceImage ) { if ( faceImage ) {
sUrl = imagePath + faceImage + faceVersion; sUrl = imagePath + faceImage + faceVersion;
realUrl = imagePath + faceImage; realUrl = imagePath + faceImage;
posflag = j < positionLine ? 0 : 1; posflag = j < positionLine ? 0 : 1;
offset = cssOffset * i * (-1) - 1; offset = cssOffset * i * (-1) - 1;
infor = emotion.SmileyInfor[tabName][i]; infor = emotion.SmileyInfor[tabName][i];
textHTML.push( '<td class="' + tableCss + '" border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' ); textHTML.push( '<td class="' + tableCss + '" border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
textHTML.push( '<span>' ); textHTML.push( '<span>' );
textHTML.push( '<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' ); textHTML.push( '<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
textHTML.push( '</span>' ); textHTML.push( '</span>' );
} else { } else {
textHTML.push( '<td width="' + iColWidth + '%" bgcolor="#FFFFFF">' ); textHTML.push( '<td width="' + iColWidth + '%" bgcolor="#FFFFFF">' );
} }
textHTML.push( '</td>' ); textHTML.push( '</td>' );
} }
textHTML.push( '</tr>' ); textHTML.push( '</tr>' );
} }
textHTML.push( '</table>' ); textHTML.push( '</table>' );
textHTML = textHTML.join( "" ); textHTML = textHTML.join( "" );
tab.innerHTML = textHTML; tab.innerHTML = textHTML;
} }
function over( td, srcPath, posFlag ) { function over( td, srcPath, posFlag ) {
td.style.backgroundColor = "#ACCD3C"; td.style.backgroundColor = "#ACCD3C";
$G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
$G( "tabIconReview" ).style.display = 'block'; $G( "tabIconReview" ).style.display = 'block';
} }
function out( td ) { function out( td ) {
td.style.backgroundColor = "transparent"; td.style.backgroundColor = "transparent";
var tabIconRevew = $G( "tabIconReview" ); var tabIconRevew = $G( "tabIconReview" );
tabIconRevew.className = ""; tabIconRevew.className = "";
tabIconRevew.style.display = 'none'; tabIconRevew.style.display = 'none';
} }
function createTabList( tabNum ) { function createTabList( tabNum ) {
var obj = {}; var obj = {};
for ( var i = 0; i < tabNum; i++ ) { for ( var i = 0; i < tabNum; i++ ) {
obj["tab" + i] = []; obj["tab" + i] = [];
} }
return obj; return obj;
} }
function createArr( tabNum ) { function createArr( tabNum ) {
var arr = []; var arr = [];
for ( var i = 0; i < tabNum; i++ ) { for ( var i = 0; i < tabNum; i++ ) {
arr[i] = 0; arr[i] = 0;
} }
return arr; return arr;
} }

View File

@ -1,89 +1,89 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> "http://www.w3.org/TR/html4/loose.dtd">
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title> <title></title>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<style type="text/css"> <style type="text/css">
.content{width:530px; height: 350px;margin: 10px auto;} .content{width:530px; height: 350px;margin: 10px auto;}
.content table{width: 100%} .content table{width: 100%}
.content table td{vertical-align: middle;} .content table td{vertical-align: middle;}
#address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;} #address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
</style> </style>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
</head> </head>
<body> <body>
<div class="content"> <div class="content">
<table> <table>
<tr> <tr>
<td><label for="address"><var id="lang_input_address"></var></label></td> <td><label for="address"><var id="lang_input_address"></var></label></td>
<td><input id="address" type="text" /></td> <td><input id="address" type="text" /></td>
<td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td> <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
</tr> </tr>
</table> </table>
<div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div> <div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
domUtils.on(window,"load",function(){ domUtils.on(window,"load",function(){
var map = new google.maps.Map(document.getElementById('container'), { var map = new google.maps.Map(document.getElementById('container'), {
zoom: 3, zoom: 3,
streetViewControl: false, streetViewControl: false,
scaleControl: true, scaleControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP mapTypeId: google.maps.MapTypeId.ROADMAP
}); });
var imgcss; var imgcss;
var marker = new google.maps.Marker({ var marker = new google.maps.Marker({
map: map, map: map,
draggable: true draggable: true
}); });
function doSearch(){ function doSearch(){
var address = document.getElementById('address').value; var address = document.getElementById('address').value;
var geocoder = new google.maps.Geocoder(); var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function (results, status) { geocoder.geocode( { 'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) { if (status == google.maps.GeocoderStatus.OK) {
var bounds = results[0].geometry.viewport; var bounds = results[0].geometry.viewport;
map.fitBounds(bounds); map.fitBounds(bounds);
marker.setPosition(results[0].geometry.location); marker.setPosition(results[0].geometry.location);
marker.setTitle(address); marker.setTitle(address);
} else alert(lang.searchError); } else alert(lang.searchError);
}); });
} }
$G('address').onkeydown = function (evt){ $G('address').onkeydown = function (evt){
evt = evt || event; evt = evt || event;
if (evt.keyCode == 13) { if (evt.keyCode == 13) {
doSearch(); doSearch();
} }
}; };
$G("doSearch").onclick = doSearch; $G("doSearch").onclick = doSearch;
dialog.onok = function (){ dialog.onok = function (){
var center = map.getCenter(); var center = map.getCenter();
var point = marker.getPosition(); var point = marker.getPosition();
var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false"; var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>'); editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
}; };
function getPars(str,par){ function getPars(str,par){
var reg = new RegExp(par+"=((\\d+|[.,])*)","g"); var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
return reg.exec(str)[1]; return reg.exec(str)[1];
} }
var img = editor.selection.getRange().getClosedNode(); var img = editor.selection.getRange().getClosedNode();
if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){ if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){
var url = img.getAttribute("src"); var url = img.getAttribute("src");
var centers = getPars(url,"center").split(","); var centers = getPars(url,"center").split(",");
point = new google.maps.LatLng(Number(centers[0]),Number(centers[1])); point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
map.setCenter(point); map.setCenter(point);
map.setZoom(Number(getPars(url,"zoom"))); map.setZoom(Number(getPars(url,"zoom")));
centers = getPars(url,"markers").split(","); centers = getPars(url,"markers").split(",");
marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1]))); marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
imgcss = img.style.cssText; imgcss = img.style.cssText;
}else{ }else{
setTimeout(function(){ setTimeout(function(){
doSearch(); doSearch();
},30) },30)
} }
}); });
</script> </script>
</body> </body>
</html> </html>

View File

@ -1,7 +1,7 @@
.wrapper{width: 370px;margin: 10px auto;zoom: 1;} .wrapper{width: 370px;margin: 10px auto;zoom: 1;}
.tabbody{height: 360px;} .tabbody{height: 360px;}
.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} .tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}
.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} .tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}
.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} .tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}
.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} .tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}
.tabbody table thead{font-weight: bold;line-height: 25px;} .tabbody table thead{font-weight: bold;line-height: 25px;}

View File

@ -1,82 +1,82 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> "http://www.w3.org/TR/html4/loose.dtd">
<html> <html>
<head> <head>
<title>帮助</title> <title>帮助</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<script type="text/javascript" src="../internal.js"></script> <script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="help.css"> <link rel="stylesheet" type="text/css" href="help.css">
</head> </head>
<body> <body>
<div class="wrapper" id="helptab"> <div class="wrapper" id="helptab">
<div id="tabHeads" class="tabhead"> <div id="tabHeads" class="tabhead">
<span class="focus" tabsrc="about"><var id="lang_input_about"></var></span> <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
<span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span> <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
</div> </div>
<div id="tabBodys" class="tabbody"> <div id="tabBodys" class="tabbody">
<div id="about" class="panel"> <div id="about" class="panel">
<h1>UEditor</h1> <h1>UEditor</h1>
<p id="version"></p> <p id="version"></p>
<p><var id="lang_input_introduction"></var></p> <p><var id="lang_input_introduction"></var></p>
</div> </div>
<div id="shortcuts" class="panel"> <div id="shortcuts" class="panel">
<table> <table>
<thead> <thead>
<tr> <tr>
<td><var id="lang_Txt_shortcuts"></var></td> <td><var id="lang_Txt_shortcuts"></var></td>
<td><var id="lang_Txt_func"></var></td> <td><var id="lang_Txt_func"></var></td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>ctrl+b</td> <td>ctrl+b</td>
<td><var id="lang_Txt_bold"></var></td> <td><var id="lang_Txt_bold"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+c</td> <td>ctrl+c</td>
<td><var id="lang_Txt_copy"></var></td> <td><var id="lang_Txt_copy"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+x</td> <td>ctrl+x</td>
<td><var id="lang_Txt_cut"></var></td> <td><var id="lang_Txt_cut"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+v</td> <td>ctrl+v</td>
<td><var id="lang_Txt_Paste"></var></td> <td><var id="lang_Txt_Paste"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+y</td> <td>ctrl+y</td>
<td><var id="lang_Txt_undo"></var></td> <td><var id="lang_Txt_undo"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+z</td> <td>ctrl+z</td>
<td><var id="lang_Txt_redo"></var></td> <td><var id="lang_Txt_redo"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+i</td> <td>ctrl+i</td>
<td><var id="lang_Txt_italic"></var></td> <td><var id="lang_Txt_italic"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+u</td> <td>ctrl+u</td>
<td><var id="lang_Txt_underline"></var></td> <td><var id="lang_Txt_underline"></var></td>
</tr> </tr>
<tr> <tr>
<td>ctrl+a</td> <td>ctrl+a</td>
<td><var id="lang_Txt_selectAll"></var></td> <td><var id="lang_Txt_selectAll"></var></td>
</tr> </tr>
<tr> <tr>
<td>shift+enter</td> <td>shift+enter</td>
<td><var id="lang_Txt_visualEnter"></var></td> <td><var id="lang_Txt_visualEnter"></var></td>
</tr> </tr>
<tr> <tr>
<td>alt+z</td> <td>alt+z</td>
<td><var id="lang_Txt_fullscreen"></var></td> <td><var id="lang_Txt_fullscreen"></var></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript" src="help.js"></script> <script type="text/javascript" src="help.js"></script>
</body> </body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More