添加分销合伙人分成功能

This commit is contained in:
wangxiaowei 2024-10-25 17:31:56 +08:00
parent a56dc73a4e
commit 6d49a582d3
8 changed files with 735 additions and 0 deletions

@ -0,0 +1,116 @@
<?php
namespace app\admin\controller\distribution;
use app\admin\logic\distribution\DistributionPartnerLogic;
use app\admin\logic\distribution\DistributionStoreTypeLogic;
use app\admin\validate\distribution\DistributionStoreTypeValidate;
use app\common\basics\AdminBase;
use app\common\logic\RegionLogic;
use app\common\model\DevRegion;
use app\common\server\JsonServer;
use think\exception\ValidateException;
use app\common\enum\DistributionPartnerEnum;
/**
* 分销商品
* Class DistributionGoodsLogic
* @package app\admin\controller\distribution
*/
class DistributionPartner extends AdminBase
{
public function lists()
{
if($this->request->isAjax()){
$get = $this->request->get();
if ($get['type'] == 1) { // 店铺类型
$list = DistributionStoreTypeLogic::templatelists($get);
} else {
$list = DistributionStoreTypeLogic::getConfig();
}
return JsonServer::success('', $list);
}
return view();
}
public function add(){
if ($this->request->isAjax()){
$post = $this->request->post();
$result = DistributionPartnerLogic::add($post);
if ($result === true){
return JsonServer::success('新增成功');
}
return JsonServer::error(DistributionStoreTypeLogic::getError());
}
$city = DevRegion::where(['level'=>2])
->field('id,name')
->select()
->toArray();
return view('', [
'city' => $city,
'partner' => DistributionPartnerEnum::getPartner()
]);
}
public function changeFields(){
$id = $this->request->get('id');
$field = $this->request->get('field');
$value = $this->request->get('value');
if ($field === 'sort') {
$result = DistributionStoreTypeLogic::changeOrderValue($id, $value);
if($result){
return JsonServer::success('修改成功');
}
}
return JsonServer::error('修改失败');
}
public function edit($id)
{
if ($this->request->isAjax()) {
$post = $this->request->post();
try {
validate(DistributionStoreTypeValidate::class)->check($post);
} catch(ValidateException $e) {
return JsonServer::error($e->getError());
}
$result = DistributionStoreTypeLogic::edit($post);
if ($result === true){
return JsonServer::success('编辑成功');
}
return JsonServer::error('编辑失败');
}
$info = DistributionStoreTypeLogic::getRechargeTemplate($id);
return view('', [
'info' => $info
]);
}
public function del($id)
{
if ($this->request->isAjax()) {
$result = DistributionStoreTypeLogic::del($id);
if ($result) {
return JsonServer::success('删除成功');
}
return JsonServer::error('删除失败');
}
}
public function setStoreType(){
if($this->request->isAjax()){
$post = $this->request->post();
DistributionStoreTypeLogic::setStoreType($post);
return JsonServer::success('设置成功');
}
}
}

@ -0,0 +1,99 @@
<?php
namespace app\admin\logic\distribution;
use app\common\basics\Logic;
use app\common\logic\RegionLogic;
use app\common\model\distribution\DistributionStoreType;
use app\common\model\distribution\DistributionPartner;
use app\common\server\ConfigServer;
use app\common\enum\DistributionPartnerEnum;
class DistributionPartnerLogic extends Logic
{
public static function templatelists($get)
{
$list = DistributionStoreType::where(['is_delete' => 0])
->order(['sort' => 'desc'])
->paginate([
'page' => $get['page'] ?? 1,
'list_rows' => $get['limit'] ?? 10,
'var_page' => 'page'
])
->toArray();
return $list;
}
public static function getConfig(){
$config = [
'open_store_type' => ConfigServer::get('distribution','store_type',0),
];
return [$config];
}
public static function add($post){
try{
$citys = explode(',', $post['citys']);
$cityIds = [];
foreach ($citys as &$v) {
$cityIds[] = RegionLogic::cityCoverId($v);
}
DistributionPartner::create([
'proportion' => str_replace('%', '', $post['proportion']),
'city' => implode(',', $cityIds),
'type' => $post['type'],
'core_city_money' => $post['core_city_money'],
'un_core_city_money' => $post['un_core_city_money'],
'is_show' => $post['is_show'],
'create_time' => time(),
]);
return true;
}catch(\Exception $e) {
self::$error = $e->getMessage();
return false;
}
}
public static function changeOrderValue($id, $value)
{
try {
DistributionStoreType::where('id', $id)->update([
'sort' => $value,
'update_time' => time(),
]);
return true;
} catch(\Exception $e) {
self::$error = $e->getMessage();
return false;
}
}
public static function getRechargeTemplate($id){
return DistributionStoreType::where(['id' => $id])->find();
}
public static function edit($post){
try{
DistributionStoreType::update([
'id' => $post['id'],
'title' => $post['title'],
'money' => $post['money'],
'sort' => $post['sort'],
'update_time' => time(),
]);
return true;
}catch(\Exception $e) {
self::$error = $e->getMessage();
return false;
}
}
public static function del($id){
return DistributionStoreType::where(['id' => $id])->update(['update_time' => time(),'is_delete' => 1]);
}
public static function setStoreType($post){
ConfigServer::set('distribution','store_type', $post['open_store_type']);
}
}

@ -0,0 +1,133 @@
{layout name="layout2" /}
<style>
.city {
margin: 10px 0 10px 110px;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
justify-content: space-between;
align-items: center;
}
.city-name {
position: relative;
text-align: center;
border: 1px solid #ccc;
border-radius: 10px;
}
.remove-city {
position: absolute;
right: 0;
top: 50%;
cursor: pointer;
transform: translateY(-50%);
}
</style>
<div class="layui-form" lay-filter="">
<div class="layui-tab">
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>比例%</label>
<div class="layui-input-block">
<input type="text" name="proportion" lay-verify="required" lay-verType="tips" placeholder="请输入比例,不用输入百分号"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>合伙人类型</label>
<div class="layui-input-block">
<select name="type" class="layui-select" lay-search >
{volist name='partner' id='vo'}
<option value="{$i}">{$vo}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>重点城市</label>
<div class="layui-input-block">
<input type="text" name="core_city_money" lay-verify="required" lay-verType="tips" placeholder="请输入重点城市金额"
autocomplete="off" class="layui-input">
</div>
<div class="layui-input-block" style="margin-top: 6px">
<select name="city" class="layui-select" lay-search lay-filter="city">
<option value="">请选择</option>
{volist name='city' id='vo'}
<option value="{$vo.name}">{$vo.name}</option>
{/volist}
</select>
</div>
<!--不要删除这个city节点-->
<div class="city"></div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>非重点城市</label>
<div class="layui-input-block">
<input type="text" name="un_core_city_money" lay-verify="required" lay-verType="tips" placeholder="请输入非重点城市金额"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-block">
<select name="is_show" class="layui-select">
<option value="1">是</option>
<option value="0">否</option>
</select>
</div>
</div>
<input type="hidden" name="citys">
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="add-recharge-submit" id="add-recharge-submit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version: "{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var $ = layui.$
, form = layui.form
const partner = {
city() {
// 添加城市
let city_arr = [];
form.on('select(city)', function (data) {
if (!city_arr.includes(data.value) && data.value !== '') {
city_arr.push(data.value)
let dom = `
<div class="city-name">
${data.value}
<i class="layui-icon remove-city" data-city="${data.value}">&#x1007;</i>
</div>
`
$(".city").append(dom)
}
$("input[name='citys']").val(city_arr.join(','))
});
// 删除城市
$(document).on("click", ".remove-city", function (e) {
const txt = $(this).data('city')
$(this).parent().remove()
city_arr = city_arr.filter((v, i) => {
return v !== txt
})
$("input[name='citys']").val(city_arr.join(','))
});
}
}
partner.city()
});
</script>

@ -0,0 +1,39 @@
{layout name="layout2" /}
<div class="layui-form" lay-filter="">
<input type="hidden" name="id" value="{$info.id}">
<div class="layui-tab">
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>类型名称</label>
<div class="layui-input-block">
<input type="text" name="title" value="{$info.title}" lay-verify="required" lay-verType="tips" placeholder="请输入类型名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label"><font color="red">*</font>金额</label>
<div class="layui-input-block">
<input type="text" name="money" value="{$info.money}" lay-verType="tips" placeholder="请输入金额" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-col-sm6 layui-col-md4">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$info.sort}" placeholder="请输入排序" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="edit-recharge-submit" id="edit-recharge-submit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version:"{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var $ = layui.$
, form = layui.form
});
</script>

@ -0,0 +1,301 @@
{layout name="layout1" /}
<style>
.layui-form-label{
width: 150px;
}
</style>
<div class="wrapper">
<div class="layui-card">
<div class="layui-tab layui-tab-card" lay-filter="tab-all">
<ul class="layui-tab-title">
<li data-type="1" class="layui-this">类型</li>
<li data-type="2">设置</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-card">
<div class="layui-card-body">
<div style="padding-bottom: 10px;" class="add">
<button class="layui-btn layui-btn-sm layuiadmin-btn-recharge {$view_theme_color}" data-type="add">新增合伙人</button>
</div>
<table id="distribution-store-type-lists" lay-filter="distribution-store-type-lists"></table>
<script type="text/html" id="recharge-operation">
<a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del">删除</a>
</script>
<script type="text/html" id="recommend">
<input type="checkbox" lay-filter="switch-status" data-id={{d.id}} data-field='is_recommend' lay-skin="switch"
lay-text="是|否" {{# if(d.is_recommend){ }} checked {{# } }} />
</script>
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="layui-form" lay-filter="">
<div class="layui-form-item">
<label class="layui-form-label">功能状态:</label>
<div class="layui-input-inline">
<input type="radio" name="open_store_type" value="1" title="开启">
<input type="radio" name="open_store_type" value="0" title="关闭">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm {$view_theme_color}" lay-submit lay-filter="set">确定</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.layui-table-cell {
height: auto;
}
</style>
<script>
layui.config({
version:"{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['table','form'], function(){
var $ = layui.$
,form = layui.form
,table = layui.table
,element = layui.element;
$('.layui-btn.layuiadmin-btn-recharge').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
//事件
var active = {
add: function(){
var index = layer.open({
type: 2
,title: '新增合伙人'
,content: '{:url("distribution.distribution_partner/add")}'
,area: ['60%', '60%']
,btn: ['保存', '取消']
,maxmin: true
,yes: function(index, layero){
var iframeWindow = window['layui-layer-iframe'+ index]
,submitID = 'add-recharge-submit'
,submit = layero.find('iframe').contents().find('#'+ submitID);
//监听提交
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
var field = data.field;
like.ajax({
url:'{:url("distribution.distribution_partner/add")}',
data:field,
type:"post",
success:function(res)
{
if(res.code == 1)
{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
});
layer.close(index); //关闭弹层
table.reload('distribution-store-type-lists'); //数据刷新
}
}
});
});
submit.trigger('click');
}
});
}
}
//获取列表
getList(1)
//切换列表
element.on('tab(tab-all)', function (data) {
var type = $(this).attr('data-type');
getList(type)
});
form.on('switch(switch-status)',function (obj) {
var id = obj.elem.attributes['data-id'].nodeValue
var fields = obj.elem.attributes['data-field'].nodeValue
var status = 0;
if(this.checked){
status = 1;
}
changeFields(id,fields,status);
})
//监听工具条
table.on('tool(distribution-store-type-lists)', function(obj){
var id = obj.data.id;
if(obj.event === 'edit'){
var id = obj.data.id;
layer.open({
type: 2
,title: '修改店铺类型'
,content: '{:url("distribution.distribution_store_type/edit")}?id='+id
,area: ['60%','60%']
,btn: ['确定', '取消']
,yes: function(index, layero){
var iframeWindow = window['layui-layer-iframe'+ index]
,submitID = 'edit-recharge-submit'
,submit = layero.find('iframe').contents().find('#'+ submitID);
//监听提交
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
var field = data.field;
like.ajax({
url:'{:url("distribution.distribution_store_type/edit")}',
data:field,
type:"post",
success:function(res)
{
if(res.code == 1)
{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
});
layer.close(index); //关闭弹层
table.reload('distribution-store-type-lists'); //数据刷新
}
}
});
});
submit.trigger('click');
}
})
}
if(obj.event === 'del'){
var title = obj.data.title;
layer.confirm('确定删除:'+'<span style="color: red">'+ title +'</span>', function(index){
like.ajax({
url:'{:url("distribution.distribution_store_type/del")}',
data:{id:id},
type:"post",
success:function(res)
{
if(res.code == 1)
{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
});
layer.close(index); //关闭弹层
table.reload('distribution-store-type-lists'); //数据刷新
}
}
});
layer.close(index);
})
}
if(obj.event === 'tips'){
layer.tips('数字越大,越靠前', $(this), {tips: [1, '#FF5722'],time:1500});
}
});
//商品排序
table.on('edit(distribution-store-type-lists)', function (obj) {
var id = obj.data.id;
var fields = 'sort';
var field_value = obj.value;
if(isNaN(field_value)){
var old_value = $(this).prev().text();
layer.tips('请输入数字', $(this), {tips: [1, '#FF5722']});
$(this).val(old_value);
return false;
}
changeFields(id,fields,field_value);
});
form.on('submit(set)', function (data) {
like.ajax({
url: '{:url("distribution.distribution_store_type/setStoreType")}'
, data: data.field
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
});
}
}
});
});
function getList(type) {
layui.define(['table', 'form'], function() {
var $ = layui.$
,table = layui.table
,form = layui.form;
var cols = [
{field: 'title', title: '类型名称', width:120,}
,{field: 'money', title: '赠送金额', width:160}
,{field: 'sort',width: 80, title:'排序', event: 'tips', edit:'text', sort: true}
,{fixed: 'right', title: '操作', align: 'center', width:300, toolbar: '#recharge-operation'}
];
table.render({
id:'distribution-store-type-lists'
,elem: '#distribution-store-type-lists'
,url: '{:url("distribution.distribution_store_type/lists")}?type=' + type //模拟接口
,cols: [cols]
,text: {none: '暂无数据!'}
,parseData: function(res){ //将原始数据解析成 table 组件所规定的数据
if(type == 2){
$("input[name=open_store_type][value=" + res.data[0].open_store_type + "]").prop("checked",true);
form.render();
}else{
return {
"code": res.code,
"msg": res.msg,
"data": res.data.data,
};
}
},
response: {
statusCode: 1
}
,done: function(res, curr, count){
// 解决操作栏因为内容过多换行问题
$(".layui-table-main tr").each(function (index, val) {
$($(".layui-table-fixed-l .layui-table-body tbody tr")[index]).height($(val).height());
$($(".layui-table-fixed-r .layui-table-body tbody tr")[index]).height($(val).height());
});
}
});
});
}
function changeFields(id,fields,value){
$.ajax({
url:'{:url("distribution.distribution_store_type/changeFields")}',
data:{id:id,field:fields,value:value},
type:'get',
dataType:'json',
success:function (res) {
if(res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
});
}
}
})
}
});
</script>

@ -0,0 +1,27 @@
<?php
namespace app\common\enum;
class DistributionPartnerEnum
{
const NORMAL_PARTNER = 1; // 普通合伙人
const REGION_PARTNER = 2; // 区域合伙人
const SENIOR_PARTNER = 3; // 高级合伙人
const STRATEGY_PARTNER = 4; // 战略合伙人
public static function getPartner($type = 'all')
{
$partner = array(
self::NORMAL_PARTNER => '普通合伙人',
self::REGION_PARTNER => '区域合伙人',
self::SENIOR_PARTNER => '高级合伙人',
self::STRATEGY_PARTNER => '战略合伙人',
);
if ($type === 'all') {
return $partner;
}
return $partner[$type];
}
}

@ -20,6 +20,7 @@
namespace app\common\logic;
use app\admin\controller\Recharge;
use app\common\basics\Logic;
use app\common\model\DevRegion;
@ -168,4 +169,14 @@ class RegionLogic extends Logic
}
return null;
}
public static function cityCoverId($city = '')
{
if ($city) {
$data = DevRegion::where(['level' => 2, 'name' => $city])->field('id')->find();
if ($data) {
return $data['id'];
}
}
}
}

@ -0,0 +1,9 @@
<?php
namespace app\common\model\distribution;
use app\common\basics\Models;
class DistributionPartner extends Models
{
}