关联产品

This commit is contained in:
古明 2025-03-24 07:02:23 +08:00
parent 561f69091d
commit e59b5e1446
6 changed files with 288 additions and 19 deletions

View File

@ -103,6 +103,9 @@ class Goods extends BaseModel
'market_price_show' => $data['market_price_show'] ?? 1,
'barrage_show' => $data['barrage_show'] ?? 1,
'is_zmxx' => $data['is_zmxx'] ?? 0,
'is_correlation' => $data['is_correlation'] ?? 0,
'correlation_type' => $data['is_correlation'] ?? 1,
'correlation_goods_ids' => json_encode($data['correlation_goods_ids'] ? explode(',',$data['correlation_goods_ids']) : [])
);
$common_data = array(
'goods_name' => $data['goods_name'],
@ -907,6 +910,10 @@ class Goods extends BaseModel
if (isset($info['real_stock'])) {
$info['real_stock'] = numberFormat($info['real_stock']);
}
if(isset($info['correlation_goods_ids'])){
$info['correlation_goods_ids'] = json_decode($info['correlation_goods_ids'],true);
$info['correlation_select_goods_ids'] = implode(',',$info['correlation_goods_ids']);
}
return $this->success($info);
}
return $this->error();
@ -1114,7 +1121,9 @@ class Goods extends BaseModel
if (isset($v['real_stock'])) {
$res['list'][$k]['real_stock'] = numberFormat($res['list'][$k]['real_stock']);
}
$res['list'][$k]['goods_kind_name'] = $res['list'][$k]['goods_kind_id'] ? '报单商品' : '进货商品';
if(isset($v['goods_kind_id'])){
$res['list'][$k]['goods_kind_name'] = $res['list'][$k]['goods_kind_id'] ? '报单商品' : '进货商品';
}
}
return $this->success($res);
}

View File

@ -34,7 +34,6 @@ use app\model\BaseModel;
use app\model\message\Message;
use addon\pointcash\model\Config as PointCashConfig;
use think\facade\Db;
/**
* 订单创建(普通订单)
*
@ -499,6 +498,8 @@ class OrderCreate extends BaseModel
//商品列表信息
$shop_goods_list = $this->getOrderGoodsCalculate($data); //获取产品信息
$buy_goods_ids = array_column($shop_goods_list['goods_list'],'goods_id');
$correlationList = $this->getGoodsCorrelationList($buy_goods_ids);
$kind = array_column($shop_goods_list['goods_list'],'goods_kind_id');
$search = array_search(0,$kind);
@ -576,6 +577,7 @@ class OrderCreate extends BaseModel
$data['member_card_money'] = $this->member_card_money;
$data['recommend_member_card'] = $this->recommend_member_card;
$data['legumes_integral_money'] = $this->legumesIntegralMoney;
$data['buy_list'] = $correlationList;
// 豆豆积分抵扣
if ($data['is_legumes_integral'] != 1) {
@ -729,7 +731,6 @@ class OrderCreate extends BaseModel
public function getOrderGoodsCalculate($data)
{
$shop_goods = $this->getCartGoodsList($data);
$shop_goods['promotion_money'] = 0;
$shop_goods_list = $shop_goods;
// 会员卡项抵扣
@ -1944,6 +1945,53 @@ class OrderCreate extends BaseModel
}
return $goods_list;
}
public function getGoodsCorrelationList($buy_goods_ids){
$goods_model = new Goods();
$condition = [
['goods_id' ,'in',$buy_goods_ids],
['is_correlation' ,'=' ,1]
];
$field = 'goods_id,goods_name,site_id,correlation_type,correlation_goods_ids';
$res = $goods_model->getGoodsList($condition,$field);
$all_ids = $one_ids = $all_list = $one_list = [];
//说明有必须关联购买的产品
if($res['data']){
foreach($res['data'] as $k => $v){
$correlation_goods_ids = json_decode($v['correlation_goods_ids'],true);
//购买其中一件
if($v['correlation_type'] == 1){
$intersection = array_intersect($correlation_goods_ids, $buy_goods_ids);
//没有交集说明没有购买其中一件商品
if(!$intersection){
$one_ids = array_merge($one_ids,$correlation_goods_ids);
}
}else if($v['correlation_type'] == 2){
$diff = array_diff($buy_goods_ids, $correlation_goods_ids);
//不包含设置的所有元素
if(!empty($diff)){
$all_ids = array_merge($all_ids,$diff);
}
}
}
if($one_ids){
$one_condition = [
['goods_id', 'IN' ,$one_ids],
['goods_state' ,'=' ,1],
['is_delete' , '=' ,0]
];
$one_list = $goods_model->getGoodsList($one_condition)['data'];
}
if($all_ids){
$all_condition = [
['goods_id', 'IN' ,$all_ids],
['goods_state' ,'=' ,1],
['is_delete' , '=' ,0]
];
$all_list = $goods_model->getGoodsList($all_condition)['data'];
}
}
return compact('all_list','one_list');
}
}

View File

@ -302,6 +302,9 @@ class Goods extends BaseShop
'is_unify_pirce' => input('is_unify_pirce', '1'),
'is_zmxx' => input('is_zmxx', 0),
'cat_id' => input('cat_id', ''),
'is_correlation' => input('is_correlation', 0),
'correlation_type' => input('correlation_type', 1),
'correlation_goods_ids' => input('correlation_goods_ids', []),
];
$goods_model = new GoodsModel();
$res = $goods_model->addGoods($data);
@ -392,6 +395,9 @@ class Goods extends BaseShop
$is_alipay_goods = 0;
if ($config_info) $is_alipay_goods = 1;
$this->assign("is_alipay_goods", $is_alipay_goods);
//商品信息
$this->assign('goods_list', []);
$this->assign('goods_ids_arr', []);
// 获取平台抽成设置
$this->assign([
'finalSet' => (new Setting())->getFinalSet((int)$this->site_id),// 获取店铺级 最终设置
@ -469,6 +475,9 @@ class Goods extends BaseShop
'is_unify_pirce' => input('is_unify_pirce','1'),
'is_zmxx' => input('is_zmxx',0),
'cat_id' => input('cat_id',''),
'is_correlation' => input('is_correlation', 0),
'correlation_type' => input('correlation_type', 1),
'correlation_goods_ids' => input('correlation_goods_ids', []),
];
$res = $goods_model->editGoods($data);
// 处理平台抽成 商品设置
@ -486,7 +495,13 @@ class Goods extends BaseShop
$goods_sku_list = $goods_model->getGoodsSkuList([['goods_id', '=', $goods_id], ['site_id', '=', $this->site_id]], "sku_id,sku_name,sku_no,sku_spec_format,price,market_price,cost_price,stock,weight,volume,sku_image,sku_images,goods_spec_format,goods_supplier_format,spec_name,stock_alarm,is_default", '')['data'];
$goods_info['sku_list'] = $goods_sku_list;
$this->assign("goods_info", $goods_info);
// 商品信息
$goodsIdsArr = $goods_info['correlation_goods_ids'] ?? [];
$goodsList = model('goods')->getList([
['goods_id', 'in', $goodsIdsArr]
], 'goods_id,goods_name,price,goods_stock');
$this->assign('goods_list', $goodsList);
$this->assign('goods_ids_arr', $goodsIdsArr);
//获取一级商品分类
$goods_category_model = new GoodsCategoryModel();

View File

@ -43,6 +43,15 @@
right: 18px;
}
.hide{display: none;}
.goods-list{
margin-top: 10px;
width: 100%;
padding-left: 140px;
display: inline-flex;
}
.goods-list .layui-table-view{
width: 900px!important;
}
</style>
{/block}
{block name="main"}
@ -683,23 +692,50 @@
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">商品表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择商品表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
<label class="layui-form-label">关联购买:</label>
<div class="layui-input-block">
<input type="radio" name="is_correlation" lay-filter="is_correlation" value="0" title="关闭" checked>
<input type="radio" name="is_correlation" lay-filter="is_correlation" value="1" title="开启" >
</div>
<div class="word-aux">
<a href="{:addon_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建商品表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
<div class="word-aux">开启后用户购买此产品必须连同关联商品一并购买</div>
</div>
<div class="layui-form-item correlation_type layui-hide">
<label class="layui-form-label">关联购买类型:</label>
<div class="layui-input-block">
<input type="radio" name="correlation_type" value="1" title="购买其一" checked>
<input type="radio" name="correlation_type" value="2" title="全部购买" >
</div>
<div class="word-aux">关联商品是否全部购买才可下单</div>
</div>
<div class="layui-form-item correlation_goods_ids layui-hide">
<label class="layui-form-label">选择关联商品:</label>
<div class="layui-input-inline">
<button class="layui-btn" onclick="addGoods()">选择商品</button>
<input type="hidden" name="correlation_goods_ids" value="" class="layui-hide">
</div>
<div class="goods-list">
<table id="selected_goods_list"></table>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">商品表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择商品表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:addon_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建商品表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
@ -1082,5 +1118,60 @@
<script src="__STATIC__/element-ui/index.js"></script>
<script>
var alipaycategory_id = ''; //支付宝分类
let selectedGoodsList = [];// 已选中的商品列表
let selectedGoodsId = [];// 已选中的商品的id列表
// 商品选择器 - 选择添加商品
function addGoods() {
goodsSelect(function(res) {
if(res.length){
selectedGoodsList = [];
selectedGoodsId = [];
for (let i = 0; i < res.length; i++) {
selectedGoodsId.push(res[i].goods_id);
selectedGoodsList.push(res[i]);
}
renderTable(selectedGoodsList);
$("input[name='goods_ids']").val(selectedGoodsId.toString());
}
}, selectedGoodsId, {mode: "spu", is_weigh: 1});
}
// 商品选择器 - 渲染已经选择的商品
function renderTable(goods_list) {
let table = new Table({
elem: '#selected_goods_list',
cols: [[
{field: 'goods_name', title: '商品名称', unresize: 'false', width: '500'},
{
field: 'price', title: '商品价格(元)', unresize: 'false', align: 'right', width: '150', templet: function (data) {
return '¥' + data.price;
}
},
{field: 'goods_stock', title: '库存', unresize: 'false', align: 'center', width: '150'},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'right', width: '100'}
]],
data: goods_list,
});
}
// 商品选择器 - 删除选中商品
function delGoods(id) {
var i, j;
$.each(selectedGoodsList, function(index, item) {
var goods_id = item.goods_id;
if (id == goods_id) {
i = index;
}
});
selectedGoodsList.splice(i, 1);
renderTable(selectedGoodsList);
$.each(selectedGoodsId, function(index, item) {
if (id == item) {
j = index;
}
});
selectedGoodsId.splice(j, 1);
$("input[name='goods_ids']").val(selectedGoodsId.toString());
}
</script>
{/block}

View File

@ -43,6 +43,15 @@
right: 18px;
}
.hide{display: none;}
.goods-list{
margin-top: 10px;
width: 100%;
padding-left: 140px;
display: inline-flex;
}
.goods-list .layui-table-view{
width: 900px!important;
}
</style>
{/block}
{block name="main"}
@ -755,6 +764,34 @@
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关联购买:</label>
<div class="layui-input-block">
<input type="radio" name="is_correlation" lay-filter="is_correlation" value="0" title="关闭" {if $goods_info['is_correlation'] == 0} checked {/if}>
<input type="radio" name="is_correlation" lay-filter="is_correlation" value="1" title="开启" {if $goods_info['is_correlation'] > 0} checked {/if}>
</div>
<div class="word-aux">开启后用户购买此产品必须连同关联商品一并购买</div>
</div>
<div class="layui-form-item correlation_type {if $goods_info['is_correlation'] == 0}layui-hide{/if}">
<label class="layui-form-label">关联购买类型:</label>
<div class="layui-input-block">
<input type="radio" name="correlation_type" value="1" title="购买其一" {if $goods_info['correlation_type'] == 1} checked {/if}>
<input type="radio" name="correlation_type" value="2" title="全部购买" {if $goods_info['correlation_type'] == 2} checked {/if}>
</div>
<div class="word-aux">关联商品是否全部购买才可下单</div>
</div>
<div class="layui-form-item correlation_goods_ids {if $goods_info['is_correlation'] == 0}layui-hide{/if">
<label class="layui-form-label">选择关联商品:</label>
<div class="layui-input-inline">
<button class="layui-btn" onclick="addGoods()">选择商品</button>
<input type="hidden" name="correlation_goods_ids" value="{$goods_info.correlation_select_goods_ids ?? ''}" class="layui-hide">
</div>
<div class="goods-list">
<table id="selected_goods_list"></table>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">商品表单:</label>
@ -1178,6 +1215,8 @@
<script src="__STATIC__/element-ui/index.js"></script>
<script src="SHOP_JS/goods_edit.js"></script>
<script>
let selectedGoodsList = JSON.parse('{:json_encode($goods_list)}');// 已选中的商品列表
let selectedGoodsId = JSON.parse('{:json_encode($goods_ids_arr)}');// 已选中的商品的id列表
var alipaycategory_id = '{$alipay_category_id??''}'; //支付宝分类
layui.use('form', function () {
$('#goods_name').on('input', function (e) {
@ -1186,5 +1225,61 @@
$('#add_goods_name .input-text-hint').html('剩余' + num);
});
});
// 商品选择器 - 选择添加商品
function addGoods() {
goodsSelect(function(res) {
if(res.length){
selectedGoodsList = [];
selectedGoodsId = [];
for (let i = 0; i < res.length; i++) {
selectedGoodsId.push(res[i].goods_id);
selectedGoodsList.push(res[i]);
}
renderTable(selectedGoodsList);
$("input[name='correlation_goods_ids']").val(selectedGoodsId.toString());
}
}, selectedGoodsId, {mode: "spu", is_weigh: 1});
}
// 商品选择器 - 渲染已经选择的商品
function renderTable(goods_list) {
let table = new Table({
elem: '#selected_goods_list',
cols: [[
{field: 'goods_name', title: '商品名称', unresize: 'false', width: '500'},
{
field: 'price', title: '商品价格(元)', unresize: 'false', align: 'right', width: '150', templet: function (data) {
return '¥' + data.price;
}
},
{field: 'goods_stock', title: '库存', unresize: 'false', align: 'center', width: '150'},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'right', width: '100'}
]],
data: goods_list,
});
}
// 商品选择器 - 删除选中商品
function delGoods(id) {
var i, j;
$.each(selectedGoodsList, function(index, item) {
var goods_id = item.goods_id;
if (id == goods_id) {
i = index;
}
});
selectedGoodsList.splice(i, 1);
renderTable(selectedGoodsList);
$.each(selectedGoodsId, function(index, item) {
if (id == item) {
j = index;
}
});
selectedGoodsId.splice(j, 1);
$("input[name='correlation_goods_ids']").val(selectedGoodsId.toString());
}
$(function () {
if(Object.values(selectedGoodsList).length > 0) renderTable(selectedGoodsList);
});
</script>
{/block}

View File

@ -19,7 +19,6 @@ var regExp = {
number: /^\d{0,10}$/,
digit: /^\d{0,10}(.?\d{0,2})$/
};
// 监听窗口
$(window).resize(function () {
var width = $(".layui-tab-content").outerWidth();
@ -133,7 +132,16 @@ $(function () {
type: 'datetime',
min: currentTime
});
//关联商品
form.on('radio(is_correlation)', function(data){
if(data.value == 1){
$('.correlation_type').removeClass('layui-hide');
$('.correlation_goods_ids').removeClass('layui-hide');
}else{
$('.correlation_type').addClass('layui-hide');
$('.correlation_goods_ids').addClass('layui-hide');
}
});
//是否上架
form.on('radio(goods_state)', function(data){
value = parseInt(data.value);
@ -1116,8 +1124,11 @@ $(function () {
});
});
//社群二维码
function couponSelected() {
if (!$("#goods tbody tr input:checked").length) {