Files
huangjingfen/pro_v3.5.1/app/services/user/channel/ChannelMerchantServices.php
panchengyong 7acbf45ff7 new files
2026-03-07 22:29:07 +08:00

378 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\user\channel;
use app\dao\user\channel\ChannelMerchantDao;
use app\services\BaseServices;
use app\services\order\StoreOrderServices;
use app\services\user\UserServices;
use crmeb\services\FormBuilder as Form;
use FormBuilder\Factory\Iview;
use think\annotation\Inject;
use think\exception\ValidateException;
use think\facade\Route as Url;
/**
* 采购商服务类
* Class ChannelMerchantServices
* @package app\services\user\channel
* @mixin ChannelMerchantDao
*/
class ChannelMerchantServices extends BaseServices
{
/**
* @var ChannelMerchantDao
*/
#[Inject]
protected ChannelMerchantDao $dao;
/**
* 获取采购商信息
* @param int $id
* @return array|\think\Response
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @author wuhaotian
* @email 442384644@qq.com
* @date 2025/5/10
*/
public function read(int $id)
{
$info = $this->dao->get($id);
if (!$info) {
return app('json')->fail('数据不存在');
}
$info = $info->toArray();
$info['avatar'] = app()->make(UserServices::class)->getUserCacheInfo($info['uid'])['avatar'] ?? '';
$orderData = app()->make(StoreOrderServices::class)->getOneData(['uid' => $info['uid'], 'channel' => 1, ['pid', '<=', 0], 'paid' => 1, 'is_del' => 0, 'is_system_del' => 0], 'COUNT(*) as order_count,SUM(pay_price) as order_price');
$info['order_count'] = $orderData['order_count'] ?? 0;
$info['order_price'] = $orderData['order_price'] ?? 0;
return $info;
}
/**
* 获取采购商列表
* @param array $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getChannelList(array $where)
{
[$page, $limit] = $this->getPageValue();
$list = $this->dao->getChannelList($where, $page, $limit);
$userService = app()->make(UserServices::class);
$identityService = app()->make(ChannelMerchantIdentityServices::class);
$identityIds = array_column($list, 'channel_type');
$identityList = $identityService->search(['id' => $identityIds, 'is_del' => 0])->column('name,discount', 'id');
$userIds = array_column($list, 'uid');
$userList = $userService->getColumn([['uid', 'in', $userIds]], 'uid,nickname,avatar,phone', 'uid');
foreach ($list as &$item) {
$item['identity_name'] = $identityList[$item['channel_type']]['name'] ?? '';
$item['identity_discount'] = $identityList[$item['channel_type']]['discount'] ?? '';
$item['user_nickname'] = $userList[$item['uid']]['nickname'] ?? '';
$item['user_avatar'] = $userList[$item['uid']]['avatar'] ?? '';
$item['user_phone'] = $userList[$item['uid']]['phone'] ?? '';
}
$count = $this->dao->count($where);
return compact('list', 'count');
}
/**
* 保存采购商数据
* @param array $data
* @return mixed
*/
public function saveChannel(array $data)
{
$data['add_time'] = time();
if ($this->dao->count(['uid' => $data['uid'], 'is_del' => 0])) {
throw new ValidateException('该用户已经是采购商了,无需重复添加!');
}
$res = $this->dao->save($data);
return $res && $this->updateUserChannelFlag($data['uid'], 1);
}
/**
* 修改采购商数据
* @param int $id
* @param array $data
* @return mixed
*/
public function updateChannel(int $id, array $data)
{
return $this->dao->update($id, $data);
}
/**
* 审核采购商
* @param int $id
* @param int $verifyStatus
* @param string $reason
* @param int $channelType
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function verifyChannel(int $id, int $verifyStatus, int $channelType = 0, string $reason = '')
{
$channel = $this->dao->getInfo($id);
if (!$channel) {
throw new ValidateException('采购商不存在');
}
if ($channel['verify_status'] == $verifyStatus) {
throw new ValidateException('请勿重复审核');
}
$updateData = [
'verify_status' => $verifyStatus,
'verify_time' => time(),
];
// 如果是审核通过,需要更新采购商身份和状态
if ($verifyStatus == 1) {
$updateData['channel_type'] = $channelType;
$updateData['status'] = 1; // 审核通过后自动开启
}
// 如果有备注,更新备注
if ($verifyStatus == 2) {
$updateData['reject'] = $reason;
}
$this->dao->update($id, $updateData);
// 审核通过后,更新用户表的采购商标识
if ($verifyStatus == 1) {
$this->updateUserChannelFlag($channel['uid'], 1);
}
return true;
}
/**
* 更新用户采购商标识
* @param int $uid 用户ID
* @param int $isChannel 采购商标识 0-否 1-是
* @return bool
*/
public function updateUserChannelFlag(int $uid, int $isChannel)
{
$userServices = app()->make(UserServices::class);
$userServices->update($uid, ['is_channel' => $isChannel]);
$userServices->cacheTag()->clear();
return true;
}
/**
* 创建审核表单
* @param int $id
* @return array
* @throws \FormBuilder\Exception\FormBuilderException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function createVerifyForm(int $id)
{
$channel = $this->dao->getInfo($id);
if (!$channel) {
throw new ValidateException('采购商不存在');
}
$identityService = app()->make(ChannelMerchantIdentityServices::class);
$identity = $identityService->getAllIdentities(['is_show' => 1]);
$options = [];
foreach ($identity as $v) {
$options[] = [
'label' => $v['name'],
'value' => $v['id']
];
}
// 创建表单
$form = [];
// 基本信息展示(只读)
$form[] = Form::hidden('id', $id);
$form[] = Form::input('channel_name', '采购商名称:', $channel['channel_name'])->disabled(true);
$form[] = Form::input('real_name', '联系人:', $channel['real_name'])->disabled(true);
$form[] = Form::input('phone', '联系电话:', $channel['phone'])->disabled(true);
// 审核状态选择
$form[] = Form::radio('verify_status', '审核结果:', 1)
->options([
['label' => '通过', 'value' => 1],
['label' => '拒绝', 'value' => 2]
])
->control([
[
'value' => 1,
'rule' => [
Form::select('channel_type', '采购商身份:', $channel['channel_type'] ?: 1)->setOptions($options)->filterable(true)->appendValidate(Iview::validateInt()->message('请选择采购商身份')->required())
]
],
[
'value' => 2,
'rule' => [
Form::textarea('reject', '拒绝原因:', '')
->placeholder('请填写拒绝原因')
->required('请填写拒绝原因')
]
]
]);
return create_form('采购商审核', $form, Url::buildUrl('/channel/merchant/verify'), 'POST');
}
/**
* 修改采购商状态
* @param int $id
* @param int $status
* @return mixed
*/
public function setStatus(int $id, int $status)
{
if (!$this->dao->getInfo($id)) {
throw new ValidateException('采购商不存在');
}
$this->updateUserChannelFlag($id, $status);
return $this->dao->update($id, ['status' => $status]);
}
/**
* 删除采购商
* @param int $id
* @return mixed
*/
public function deleteChannel(int $id)
{
if (!$info = $this->dao->getInfo($id)) {
throw new ValidateException('采购商不存在');
}
$this->updateUserChannelFlag($info['uid'], 0);
return $this->dao->update($id, ['is_del' => 1]);
}
/**
* 获取表单
* @param array $formData
* @return array
* @throws \FormBuilder\Exception\FormBuilderException
*/
public function createForm(array $formData = [])
{
$id = $formData['id'] ?? 0;
$form = [];
if (!$formData) {
$form[] = Form::frameImage('image', '商城用户:', $this->url('admin/system.user/list', ['fodder' => 'image'], true))
->icon('ios-add')->width('960px')->height('550px')->modal(['footer-hide' => true])->Props(['srcKey' => 'image']);
$form[] = Form::hidden('uid', 0);
}
$form = $form + [
Form::hidden('id', $id),
Form::input('channel_name', '采购商名称:', $formData['channel_name'] ?? '')->required('请填写采购商名称'),
Form::input('real_name', '联系人:', $formData['real_name'] ?? '')->required('请填写联系人'),
Form::input('phone', '联系电话:', $formData['phone'] ?? '')->required('请填写联系电话'),
Form::cityArea('province', '所在地区:', $formData['province'] ?? '')->type('city_area')->info('请选择省市区')->required('请选择地区'),
Form::input('address', '详细地址:', $formData['address'] ?? '')->required('请填写详细地址'),
Form::radio('channel_type', '采购商身份:', $formData['channel_type'] ?? 1)->options([
['label' => '省级', 'value' => 1],
['label' => '市级', 'value' => 2],
['label' => '区级', 'value' => 3],
]),
Form::frameImages('certificate', '资质照片:', url('admin/widget.images/index', ['fodder' => 'certificate']), $formData['certificate'] ?? [])->maxLength(5),
Form::radio('status', '状态', $formData['status'] ?? 1)->options([
['label' => '开启', 'value' => 1],
['label' => '关闭', 'value' => 0],
]),
Form::textarea('admin_remark', '备注信息:', $formData['remark'] ?? ''),
];
return create_form($id ? '编辑采购商' : '添加采购商', $form, Url::buildUrl('/channel/merchant/save'), 'POST');
}
/**
* 申请成为采购商
* @param array $data
* @param array $userInfo
* @param int $id
* @return bool
*/
public function apply(array $data, int $id = 0)
{
// 检查是否有正在审核的申请
$existApply = $this->dao->getChannelInfo(['uid' => $data['uid'], 'verify_status' => 0]);
if ($existApply) {
throw new ValidateException('您有正在审核的申请,请耐心等待');
}
$data['province_ids'] = is_array($data['province_ids']) ? implode(',', $data['province_ids']) : '';
$channelData = [
'uid' => $data['uid'],
'channel_name' => $data['channel_name'] ?? '',
'real_name' => $data['real_name'],
'phone' => $data['phone'],
'province' => $data['province'] ?? '',
'province_ids' => $data['province_ids'],
'address' => $data['address'] ?? '',
'certificate' => $data['certificate'] ?? '',
'remark' => $data['remark'] ?? '',
'verify_status' => 0,
'status' => 0,
];
if ($id) {
$result = $this->dao->update($id, $channelData);
} else {
$channelData['add_time'] = time();
$result = $this->dao->save($channelData);
}
if (!$result) {
throw new ValidateException('申请提交失败');
}
return true;
}
/**
* 是否采购商
* @param $uid
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2025/4/8 下午3:07
*/
public function isChannel(int $uid, bool $is_discount = false)
{
if (!$uid) {
return false;
}
$info = $this->dao->getChannelInfo(['uid' => $uid, 'status' => 1, 'is_del' => 0]);
if (!$info) {
return false;
}
if ($is_discount) {
$iden_info = app()->make(ChannelMerchantIdentityServices::class)->search(['id' => $info['channel_type']])->find();
$discount = $iden_info['discount'] ?? 100;
$discount = bcmul($discount, 0.01, 2);
$iden_name = $iden_info['name'] ?? '';
$channel_type = $info['channel_type'];
return compact('iden_name', 'discount', 'channel_type');
}
return true;
}
}