508 lines
18 KiB
PHP
508 lines
18 KiB
PHP
<?php
|
|
|
|
namespace app\controller\manager;
|
|
|
|
use app\exception\RepositoryException;
|
|
use app\model\Account;
|
|
use app\model\Coupon;
|
|
use app\model\CouponMain;
|
|
use app\model\Category as CategoryModel;
|
|
use app\model\Business as BusinessModel;
|
|
use app\model\Member;
|
|
use app\model\BusinessCircle as BusinessCircleModel ;
|
|
use app\repository\AccountRepository;
|
|
use app\repository\BusinessRepository;
|
|
use app\repository\CouponRepository;
|
|
use app\repository\RechargeRepository;
|
|
use app\service\wx\WechatPay;
|
|
use Endroid\QrCode\Builder\Builder;
|
|
use Endroid\QrCode\Encoding\Encoding;
|
|
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
|
|
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
|
|
use Endroid\QrCode\Writer\PngWriter;
|
|
use Exception;
|
|
|
|
use think\exception\ValidateException;
|
|
use think\facade\Db;
|
|
use think\response\Json;
|
|
use think\response\View;
|
|
|
|
/*商家*/
|
|
|
|
class Business extends Base
|
|
{
|
|
protected $noNeedLogin = ['downloadWriteOffCode'];
|
|
|
|
/**
|
|
* 商家列表列表
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function index()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$repo = BusinessRepository::getInstance();
|
|
$keyword = $this->request->param('keyword/s', '');
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 30);
|
|
|
|
$whereMap = [
|
|
["a.state", "=", BusinessModel::state_on],
|
|
["b.type", "=", Account::type_business]
|
|
];
|
|
$orders = ['a.id' => 'desc'];
|
|
if (!empty($keyword)) {
|
|
$whereMap[] = ['b.nick_name|a.business_name|a.business_subtitle', 'like', "%$keyword%"];
|
|
}
|
|
//如果是渠道商或者工作人员 只查看自己的下级商家
|
|
if(Member::is_agency($this->auth['roles'])){
|
|
$whereMap[] = ['a.agency_code', '=', $this->auth['business_code']];
|
|
}
|
|
$list = $repo->businessList($whereMap, $page, $size, $orders);
|
|
$list["list"]->each(function ($item) {
|
|
//得到当前商家的所有签到券
|
|
$date = date("Y-m-d H:i:s");
|
|
//签到券总数
|
|
$item->coupon_total_count = CouponMain::where(["business_code" => $item->business_code])->sum("count");
|
|
|
|
//进行中签到券总数
|
|
$item->coupon_doing_count = CouponMain::where(["business_code" => $item->business_code])
|
|
->whereTime("start_time", "<", $date)
|
|
->whereTime("end_time", ">", $date)
|
|
->where("status", CouponMain::status_on)
|
|
->where("on_shelf", CouponMain::on_shelf_on)
|
|
->sum("count");
|
|
|
|
//进行中签到券总数
|
|
$item->coupon_receive_count = CouponMain::where(["business_code" => $item->business_code])->sum("received_count");
|
|
|
|
//过期未使用签到券总数
|
|
$item->coupon_be_overdue_count = Coupon::where(["business_code" => $item->business_code])
|
|
->where("is_verificated", "=", Coupon::is_verificated_off)
|
|
->whereTime("end_time", "<", $date)
|
|
->count();
|
|
|
|
//已使用签到券总数
|
|
$item->coupon_used_count = Coupon::where(["business_code" => $item->business_code])
|
|
->where("is_verificated", "=", Coupon::is_verificated_on)
|
|
->count();
|
|
|
|
//产生的总收益数
|
|
$item->coupon_profit_count = BusinessRepository::getInstance()->businessProfitTotal( $item->business_code);
|
|
|
|
//商家充值总额
|
|
$item->recharge_total_money = $item->total_recharge;
|
|
});
|
|
|
|
return $this->json(0, 'success', $list);
|
|
}
|
|
|
|
//商家不能指派代理商
|
|
$roles = explode(",", $this->auth['roles']);
|
|
$this->data["isAdmin"] = in_array(Member::MANAGER_ROLE_ID, $roles);
|
|
|
|
|
|
return $this->view();
|
|
}
|
|
|
|
|
|
/**
|
|
* 商家签到券列表
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessCouponList()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
if ($this->request->isPost()) {
|
|
|
|
event('CouponStatusCheck');
|
|
|
|
$repo = BusinessRepository::getInstance();
|
|
$keyword = $this->request->param('keyword/s', '');
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 30);
|
|
|
|
$whereMap = ["business_code" => $businessCode];
|
|
|
|
if (!empty($keyword)) {
|
|
$whereMap[] = ['name', 'like', "%$keyword%"];
|
|
}
|
|
|
|
$list = $repo->businessCouponList($whereMap, $page, $size, ["create_time" => "desc", "id" => "desc"]);
|
|
|
|
return $this->json(0, 'success', $list);
|
|
}
|
|
$this->data["businessCode"] = $businessCode;
|
|
return $this->view();
|
|
}
|
|
|
|
|
|
/**
|
|
* 商家扣费记录列表
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessDeductionList()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
if ($this->request->isPost()) {
|
|
$repo = BusinessRepository::getInstance();
|
|
$keyword = $this->request->param('keyword/s', '');
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 30);
|
|
|
|
$whereMap = ["business_code" => $businessCode];
|
|
|
|
if (!empty($keyword)) {
|
|
$whereMap[] = ['reason', 'like', "%$keyword%"];
|
|
}
|
|
|
|
$list = $repo->businessDeductionList($whereMap, $page, $size, ["create_time" => "desc", "id" => "desc"]);
|
|
|
|
return $this->json(0, 'success', $list);
|
|
}
|
|
$this->data["businessCode"] = $businessCode;
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 商家充值记录列表
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessRechargeList()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
if ($this->request->isPost()) {
|
|
$repo = BusinessRepository::getInstance();
|
|
$keyword = $this->request->param('keyword/s', '');
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 30);
|
|
|
|
$whereMap = ["business_code" => $businessCode];
|
|
|
|
if (!empty($keyword)) {
|
|
$whereMap[] = ['order_num', 'like', "%$keyword%"];
|
|
}
|
|
|
|
$list = $repo->businessRechargeList($whereMap, $page, $size, ["create_time" => "desc", "id" => "desc"]);
|
|
|
|
return $this->json(0, 'success', $list);
|
|
}
|
|
$this->data["businessCode"] = $businessCode;
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 商家详情
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessDetail()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
$business = BusinessRepository::getInstance()->findOneByWhere(['code' => $businessCode]);
|
|
if ($this->request->isPost()) {
|
|
if(empty($business)){
|
|
return $this->json(4001,"商家不存在");
|
|
}
|
|
$item = input('post.');
|
|
$validate = $this->validateByApi($item, [
|
|
'business_name|商家名称' => 'require|max:100',
|
|
'business_subtitle|商家简称' => 'max:100',
|
|
'lat|纬度' => 'require',
|
|
'lng|经度' => 'require',
|
|
'province|省市区' => 'require',
|
|
'city|省市区' => 'require',
|
|
'county|省市区' => 'require',
|
|
'business_address|地址' => 'require|min:3',
|
|
'contact_name|联系人' => 'require|min:1',
|
|
'contact_phone|联系电话' => 'require|mobile',
|
|
'state|审核状态' => 'require|in:0,1,2',
|
|
'enable|启用状态' => 'require|in:0,1',
|
|
'type|分类' => 'require|number',
|
|
//'characteristic|特色' => 'max:100',
|
|
// 'intro|介绍' => 'require',
|
|
'business_circle_id|商圈' => 'require',
|
|
'background|背景图' => 'require',
|
|
'model|商家模式' => 'require',
|
|
//'score|评分' => 'require|in:1,2,3,4,5',
|
|
'reason|驳回原因' => 'max:100',
|
|
]);
|
|
|
|
if ($validate !== true) {
|
|
return $validate;
|
|
}
|
|
|
|
if($item["model"] == BusinessModel::model_time_limit){
|
|
$validateModel = $this->validateByApi($item, [
|
|
'time_limit_start|时限商家模式【开始时间】' => 'require|date',
|
|
'time_limit_end|时限商家模式【结束时间】' => 'require|date|after:'.date("Y-m-d",strtotime("+1 day")),
|
|
'time_limit_release_count|时限商家模式可发布签到券个数' => 'require|>:0',
|
|
]);
|
|
if ($validateModel !== true) {
|
|
return $validateModel;
|
|
}
|
|
}
|
|
|
|
Db::startTrans();
|
|
try {
|
|
$business->save($item);
|
|
//修改所属的签到券
|
|
CouponRepository::getInstance()->updateCouponMainByBusinessCode($business["code"],[
|
|
"business_circle_id"=>$item["business_circle_id"],
|
|
"business_type"=>$item["type"],
|
|
]);
|
|
Db::commit();
|
|
return $this->json();
|
|
} catch (ValidateException $e) {
|
|
Db::rollback();
|
|
return $this->json(4001, $e->getError());
|
|
}
|
|
|
|
}
|
|
|
|
if (empty($business)) {
|
|
return $this->error("商家不存在");
|
|
}
|
|
$this->data["item"] = $business;
|
|
$this->data["type"] = CategoryModel::getByGroup();
|
|
$this->data["businessCircle"] = BusinessCircleModel::getList();
|
|
$this->data["model"] = BusinessModel::allModel();
|
|
$this->data["model_ordinary"] = BusinessModel::model_ordinary;
|
|
$this->data["model_time_limit"] = BusinessModel::model_time_limit;
|
|
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 商家认证列表
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessWaitList()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
|
|
$repo = BusinessRepository::getInstance();
|
|
$keyword = $this->request->param('keyword/s', '');
|
|
$page = $this->request->param('page/d', 1);
|
|
$size = $this->request->param('size/d', 30);
|
|
|
|
|
|
|
|
$whereMap = [
|
|
["a.state", "in", [BusinessModel::state_reviewing, BusinessModel::state_off]],
|
|
["b.type", "=", Account::type_consumer]
|
|
];
|
|
//如果是渠道商或者工作人员 只查看自己的下级商家
|
|
if(Member::is_agency($this->auth['roles'])){
|
|
$whereMap[] = ['a.agency_code', '=', $this->auth['business_code']];
|
|
}
|
|
$orders = ['a.id' => 'desc'];
|
|
if (!empty($keyword)) {
|
|
$whereMap[] = ['b.nick_name|a.business_name', 'like', "%$keyword%"];
|
|
}
|
|
|
|
$list = $repo->businessList($whereMap, $page, $size, $orders);
|
|
|
|
return $this->json(0, 'success', $list);
|
|
}
|
|
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 执行商家认证
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function businessWait()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$businessCode = input("business_code/s", "");
|
|
$state = input("state/d", 0);
|
|
$reason = input("reason/s", '');
|
|
if (!in_array($state, [BusinessModel::state_off, BusinessModel::state_on])) {
|
|
return $this->json(4001, "错误的审核状态");
|
|
}
|
|
|
|
$business = BusinessRepository::getInstance()->findOneByWhere(["code" => $businessCode]);
|
|
if (empty($business)) {
|
|
return $this->json(4001, "商家不存在");
|
|
}
|
|
if ($business['state'] != BusinessModel::state_reviewing) {
|
|
return $this->json(4001, "商家当前状态不可审核");
|
|
}
|
|
$account = AccountRepository::getInstance()->findOneByWhere(["business_code" => $businessCode]);
|
|
if (empty($account)) {
|
|
return $this->json(4001, "关联用户不存在");
|
|
}
|
|
|
|
Db::startTrans();
|
|
try {
|
|
$business->save(["state" => $state, "reason" => $reason]);
|
|
//通过 就改变用户为商家
|
|
if($state == BusinessModel::state_on){
|
|
$account->save(["type" => Account::type_business]);
|
|
}
|
|
|
|
Db::commit();
|
|
return $this->json();
|
|
} catch (RepositoryException $e) {
|
|
Db::rollback();
|
|
return $this->json("5001", "审核失败");
|
|
} catch (\think\Exception $e) {
|
|
Db::rollback();
|
|
return $this->json("5002", "审核失败");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 给商家指派代理商
|
|
*
|
|
* @return Json|View
|
|
* @throws Exception
|
|
*/
|
|
public function assign()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
$business = BusinessRepository::getInstance()->findOneByWhere(["code" => $businessCode]);
|
|
|
|
if ($this->request->isPost()) {
|
|
$anentCode = input("agency_code/s", "");
|
|
if (empty($business)) {
|
|
return $this->json(4001, "商家不存在");
|
|
}
|
|
Db::startTrans();
|
|
try {
|
|
$business->save([
|
|
"agency_code" => $anentCode,
|
|
"is_assign" => empty($anentCode) ? BusinessModel::COMMON_OFF : BusinessModel::COMMON_ON
|
|
]);
|
|
Db::commit();
|
|
return $this->json();
|
|
} catch (RepositoryException $e) {
|
|
Db::rollback();
|
|
return $this->json("5001", "指派失败");
|
|
} catch (\think\Exception $e) {
|
|
Db::rollback();
|
|
return $this->json("5002", "指派失败");
|
|
}
|
|
}
|
|
if (empty($business)) {
|
|
return $this->error("商家不存在");
|
|
}
|
|
$this->data["agent"] = Member::getAgentAll();
|
|
$this->data["businessCode"] = $businessCode;
|
|
$this->data["business"] = $business;
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 代为充值
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
public function rechargeBehalf()
|
|
{
|
|
$businessCode = input("business_code/s", "");
|
|
$business = BusinessRepository::getInstance()->findOneByWhere(["code" => $businessCode]);
|
|
|
|
if ($this->request->isPost()) {
|
|
$money = input("money/f", 0, "abs");
|
|
if ($money <= 0) {
|
|
return $this->json(4001, "金额错误");
|
|
}
|
|
$money = floor($money * 100) / 100;
|
|
if (empty($business)) {
|
|
return $this->json(4001, "商家不存在");
|
|
}
|
|
Db::startTrans();
|
|
try {
|
|
//创建充值订单
|
|
if (!$order = RechargeRepository::getInstance()->adminCreateOrder($businessCode, $money)) {
|
|
throw new RepositoryException('订单创建失败,请稍后重试');
|
|
}
|
|
//生成支付
|
|
$res = WechatPay::getInstance()->order->unify([
|
|
'body' => '商家充值',
|
|
'out_trade_no' => $order->order_num,
|
|
'total_fee' => $money * 100,
|
|
'trade_type' => 'NATIVE',
|
|
'product_id' => $order->id,
|
|
'notify_url' => $this->request->domain() . "/api/recharge/notify.html",
|
|
]);
|
|
|
|
if (!isset($res['code_url'])) {
|
|
throw new RepositoryException('订单创建失败,请稍后重试');
|
|
}
|
|
|
|
Db::commit();
|
|
return $this->json(0, "success", ["order_num" => $order->order_num, "code_url" => $res['code_url']]);
|
|
} catch (RepositoryException $e) {
|
|
Db::rollback();
|
|
return $this->json("5001", $e->getMessage());
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
return $this->json("5002", $e->getMessage());
|
|
}
|
|
|
|
}
|
|
if (empty($business)) {
|
|
return $this->error("商家不存在");
|
|
}
|
|
|
|
$this->data["businessCode"] = $businessCode;
|
|
|
|
return $this->view();
|
|
}
|
|
|
|
/**
|
|
* 下载商家核销二维码
|
|
* */
|
|
public function downloadWriteOffCode()
|
|
{
|
|
$businessCode = input("business_code/s");
|
|
if(empty($businessCode)){
|
|
return $this->error("商家信息错误");
|
|
}
|
|
$qrData = $this->request->domain() . "/business_code_to_coupon_list?business_code=" . $businessCode;
|
|
|
|
$w = 3000;//尺寸
|
|
|
|
$logoImg = app()->getRootPath().'public/static/images/icon-logo.jpg';
|
|
|
|
$result = Builder::create()
|
|
->writer(new PngWriter())
|
|
->writerOptions([])
|
|
->data($qrData)
|
|
->encoding(new Encoding('UTF-8'))
|
|
->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
|
|
->size($w)
|
|
->margin(10)
|
|
->roundBlockSizeMode(new RoundBlockSizeModeMargin())
|
|
->logoPath($logoImg)
|
|
->logoResizeToHeight(ceil($w/6))
|
|
->logoResizeToWidth(ceil($w/6))
|
|
->logoPunchoutBackground(true)
|
|
->build();
|
|
header(
|
|
"Content-type: image/jpg"
|
|
);
|
|
$path = "/storage/business/" . $businessCode . ".jpg";
|
|
$result->saveToFile( public_path() . $path);
|
|
|
|
return download(public_path() . $path,$businessCode);
|
|
}
|
|
|
|
} |