mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-23 02:45:33 +08:00
946 lines
44 KiB
PHP
946 lines
44 KiB
PHP
<?php
|
||
/**
|
||
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
|
||
class openapi_data_original_salesmaterial{
|
||
|
||
protected $_type = array(
|
||
'1' => '普通',
|
||
'2' => '组合',
|
||
'3' => '赠品',
|
||
'4' => '福袋',
|
||
'5' => '多选一',
|
||
);
|
||
|
||
/**
|
||
* 获取List
|
||
* @param mixed $filter filter
|
||
* @param mixed $offset offset
|
||
* @param mixed $limit limit
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getList($filter,$offset=0,$limit=40)
|
||
{
|
||
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
|
||
|
||
$basicMaterialStockObj = app::get('material')->model('basic_material_stock');
|
||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||
$salesMaterialExtObj = app::get('material')->model('sales_material_ext');
|
||
$lib_ma_ba_ma = kernel::single('material_basic_material');
|
||
$mdl_ma_go_ty = app::get('ome')->model('goods_type');
|
||
|
||
$goodscount = $salesMaterialObj->count($filter);
|
||
$goodslist = $salesMaterialObj->getList('*',$filter,$offset,$limit);
|
||
if(empty($goodslist)){
|
||
return array('list' => array(),'count' => $goodscount);
|
||
}
|
||
$smIds = [];
|
||
$luckybag_smIds = [];
|
||
$pickone_smIds = [];
|
||
foreach ($goodslist as $value) {
|
||
$smIds[] = $value['sm_id'];
|
||
if($value['sales_material_type'] == 4){
|
||
$luckybag_smIds[] = $value['sm_id'];
|
||
}elseif($value['sales_material_type'] == 5){
|
||
$pickone_smIds[] = $value['sm_id'];
|
||
}
|
||
}
|
||
$salesMaterialExtListRaw = $salesMaterialExtObj->getList('sm_id,unit,retail_price', array('sm_id'=>$smIds));
|
||
$salesMaterialExtList = array();
|
||
foreach ($salesMaterialExtListRaw as $ext) {
|
||
$salesMaterialExtList[$ext['sm_id']] = $ext;
|
||
}
|
||
$bmIds = [];
|
||
$arrLuckybag = [];
|
||
if(!empty($luckybag_smIds)){
|
||
$mdl_ma_sa_ma = app::get('material')->model('luckybag_rules');
|
||
$rs_luckybag_info = $mdl_ma_sa_ma->getList("*",array("sm_id"=>$luckybag_smIds));
|
||
foreach ($rs_luckybag_info as $value) {
|
||
$arrLuckybag[$value['sm_id']][] = $value;
|
||
$bmIds = array_merge($bmIds, explode(",", $value['bm_ids']));
|
||
}
|
||
unset($rs_luckybag_info);
|
||
}
|
||
$arrPickone = [];
|
||
if(!empty($pickone_smIds)){
|
||
$mdl_ma_sa_ma = app::get('material')->model('pickone_rules');
|
||
$rs_pickone_info = $mdl_ma_sa_ma->getList("*",array("sm_id"=>$pickone_smIds));
|
||
foreach ($rs_pickone_info as $value) {
|
||
$arrPickone[$value['sm_id']][] = $value;
|
||
$bmIds[] = $value['bm_id'];
|
||
}
|
||
unset($rs_pickone_info);
|
||
}
|
||
$smbm = app::get('material')->model('sales_basic_material')->getList('*', ['sm_id'=>$smIds]);
|
||
$arrSmBm = [];
|
||
foreach ($smbm as $value) {
|
||
$bmIds[] = $value['bm_id'];
|
||
$arrSmBm[$value['sm_id']][] = $value;
|
||
}
|
||
unset($smbm);
|
||
$bmIds = array_unique($bmIds);
|
||
$bmInfoList = [];
|
||
$arrStoreInfo = [];
|
||
$arrType = [];
|
||
if(!empty($bmIds)){
|
||
//a.bm_id, a.material_bn, a.material_name, a.visibled, b.cost, b.retail_price, b.weight, b.unit, b.specifications, b.brand_id, b.cat_id, c.code
|
||
$bmInfoList = $lib_ma_ba_ma->getBasicMaterialByBmids($bmIds);
|
||
$bmInfoList = array_column($bmInfoList, null, 'bm_id');
|
||
$arrStoreInfo = $basicMaterialStockObj->getList('bm_id,store,store_freeze', array('bm_id'=>$bmIds));
|
||
$arrStoreInfo = array_column($arrStoreInfo, null, 'bm_id');
|
||
$arrType = $mdl_ma_go_ty->getList('type_id,name', ['type_id'=>array_column($bmInfoList, 'cat_id')]);
|
||
$arrType = array_column($arrType, null, 'type_id');
|
||
}
|
||
$list = array();
|
||
$formatFilter=kernel::single('openapi_format_abstract');
|
||
foreach ((array) $goodslist as $value) {
|
||
$unit = isset($salesMaterialExtList[$value['sm_id']]['unit']) ? $salesMaterialExtList[$value['sm_id']]['unit'] : '';
|
||
$retail_price = isset($salesMaterialExtList[$value['sm_id']]['retail_price']) ? $salesMaterialExtList[$value['sm_id']]['retail_price'] : '';
|
||
|
||
$good = array(
|
||
'sales_material_bn' => $formatFilter->charFilter($value['sales_material_bn']),
|
||
'sales_material_name' => $formatFilter->charFilter($value['sales_material_name']),
|
||
'unit' => $formatFilter->charFilter($unit),
|
||
'sales_material_type' => $value['sales_material_type'],
|
||
'sales_material_type_name' => $salesMaterialObj->modifier_sales_material_type($value['sales_material_type']),
|
||
'retail_price' => $retail_price,
|
||
'shop_id' => $value['shop_id'],
|
||
);
|
||
|
||
if($value['sales_material_type'] == 4){ //福袋
|
||
$rs_luckybag_info = isset($arrLuckybag[$value['sm_id']]) ? $arrLuckybag[$value['sm_id']] : [];
|
||
foreach($rs_luckybag_info as $var_l_i){
|
||
$basic_materials = array();
|
||
$bm_ids_arr = explode(",", $var_l_i["bm_ids"]);
|
||
foreach($bm_ids_arr as $var_bm_id){
|
||
$rs_basic_ma_info = isset($bmInfoList[$var_bm_id]) ? $bmInfoList[$var_bm_id] : [];
|
||
$storeInfo = isset($arrStoreInfo[$var_bm_id]) ? $arrStoreInfo[$var_bm_id] : [];
|
||
$basic_materials[] = array(
|
||
"material_bn" => $formatFilter->charFilter($rs_basic_ma_info['material_bn']),
|
||
"material_name" => $formatFilter->charFilter($rs_basic_ma_info['material_name']),
|
||
"store" => $storeInfo['store'],
|
||
"store_freeze" => $storeInfo['store_freeze'],
|
||
"weight" => $rs_basic_ma_info['weight'],
|
||
"cost" => $rs_basic_ma_info['cost'],
|
||
"retail_price" => $rs_basic_ma_info['retail_price'],
|
||
"barcode" => $rs_basic_ma_info["code"],
|
||
'number' => 1, //关联的基础物料数量
|
||
'rate' => 100, //关联的基础物料贡献比
|
||
);
|
||
}
|
||
$luckybagInfo = array(
|
||
"lbr_id" => $var_l_i["lbr_id"],
|
||
"lbr_name" => $var_l_i["lbr_name"],
|
||
"sku_num" => $var_l_i["sku_num"],
|
||
"send_num" => $var_l_i["send_num"],
|
||
"price" => $var_l_i["price"],
|
||
"basic_materials" => $basic_materials,
|
||
);
|
||
$luckybagInfo = array_map(function($info) {return is_null($info) ? '' : $info;}, $luckybagInfo);
|
||
$good['luckybag_rules'][] = $luckybagInfo;
|
||
}
|
||
}elseif($value['sales_material_type'] == 5){ //多选一
|
||
$rs_pickone_info = isset($arrPickone[$value['sm_id']]) ? $arrPickone[$value['sm_id']] : [];
|
||
$good["pickone_select_type"] = ($rs_pickone_info[0]["select"] == "2") ? "排序" : "随机";
|
||
foreach($rs_pickone_info as $var_p_i){
|
||
$rs_basic_ma_info = isset($bmInfoList[$var_p_i["bm_id"]]) ? $bmInfoList[$var_p_i["bm_id"]] : [];
|
||
$storeInfo = isset($arrStoreInfo[$var_p_i["bm_id"]]) ? $arrStoreInfo[$var_p_i["bm_id"]] : [];
|
||
$pickoneInfo = array(
|
||
"sort" => $var_p_i["sort"],
|
||
"material_bn" => $formatFilter->charFilter($rs_basic_ma_info['material_bn']),
|
||
"material_name" => $formatFilter->charFilter($rs_basic_ma_info['material_name']),
|
||
"store" => $storeInfo['store'],
|
||
"store_freeze" => $storeInfo['store_freeze'],
|
||
"weight" => $rs_basic_ma_info['weight'],
|
||
"cost" => $rs_basic_ma_info['cost'],
|
||
"retail_price" => $rs_basic_ma_info['retail_price'],
|
||
"barcode" => $rs_basic_ma_info["code"],
|
||
'number' => 1, //关联的基础物料数量
|
||
'rate' => 100, //关联的基础物料贡献比
|
||
);
|
||
$pickoneInfo = array_map(function($info) {return is_null($info) ? '' : $info;}, $pickoneInfo);
|
||
$good['pickone_rules'][] = $pickoneInfo;
|
||
}
|
||
}else{
|
||
if(isset($arrSmBm[$value['sm_id']])){
|
||
foreach($arrSmBm[$value['sm_id']] as $basicMInfo){
|
||
$rs_basic_ma_info = isset($bmInfoList[$basicMInfo['bm_id']]) ? $bmInfoList[$basicMInfo['bm_id']] : [];
|
||
$storeInfo = isset($arrStoreInfo[$basicMInfo['bm_id']]) ? $arrStoreInfo[$basicMInfo['bm_id']] : [];
|
||
$typeRow = isset($arrType[$rs_basic_ma_info['cat_id']]) ? $arrType[$rs_basic_ma_info['cat_id']] : [];
|
||
|
||
$basicInfo = array(
|
||
'material_bn' => $formatFilter->charFilter($rs_basic_ma_info['material_bn']),
|
||
'material_name' => $formatFilter->charFilter($rs_basic_ma_info['material_name']),
|
||
'store' => $storeInfo['store'],
|
||
'store_freeze' => $storeInfo['store_freeze'],
|
||
'weight' => $rs_basic_ma_info['weight'],
|
||
'cost' => $rs_basic_ma_info['cost'],
|
||
'goods_type_id' => $typeRow['type_id'],
|
||
'goods_type_name' => $typeRow['name'],
|
||
'retail_price' => $rs_basic_ma_info['retail_price'],
|
||
'barcode' => $formatFilter->charFilter($rs_basic_ma_info['code']),
|
||
'number' => $basicMInfo['number'], //关联的基础物料数量
|
||
'rate' => $basicMInfo['rate'], //关联的基础物料贡献比
|
||
);
|
||
$basicInfo = array_map(function($info) {return is_null($info) ? '' : $info;}, $basicInfo);
|
||
$good['basic_materials'][] = $basicInfo;
|
||
}
|
||
}
|
||
}
|
||
$good = array_map(function($v) {return is_null($v) ? '' : $v;}, $good);
|
||
|
||
$list[] = $good;
|
||
}
|
||
|
||
return array('list' => $list,'count' => (int) $goodscount);
|
||
}
|
||
|
||
/**
|
||
* 销售物料新增检查
|
||
* @param Array $params
|
||
* @param String $err_msg
|
||
* @return Array
|
||
*/
|
||
private function _checkAddParams(&$params, &$err_msg){
|
||
if(empty($params['sales_material_name']) || empty($params['sales_material_bn'])){
|
||
$err_msg ="必填信息不能为空";
|
||
return false;
|
||
}
|
||
|
||
//去除空格
|
||
$params['sales_material_bn'] = trim($params['sales_material_bn']);
|
||
|
||
//销售物料信息
|
||
$basicMaterialObj = app::get('material')->model('basic_material');
|
||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||
$salesMaterialInfo = $salesMaterialObj->getList('sales_material_bn',array('sales_material_bn'=>$params['sales_material_bn']));
|
||
if($salesMaterialInfo){
|
||
$err_msg ="当前新增的物料编码已被使用,不能重复";
|
||
return false;
|
||
}
|
||
|
||
$params['sales_material_bn_crc32'] = sprintf('%u',crc32($params['sales_material_bn']));
|
||
|
||
if($params['sales_material_type'] == 4){ //福袋
|
||
$result_check_format = $this->check_luckybag_content($params,$err_msg);
|
||
if(!$result_check_format && $err_msg){
|
||
return false;
|
||
}
|
||
$params["luckybag_arr"] = $result_check_format;
|
||
}elseif($params['sales_material_type'] == 5){ //多选一
|
||
$result_check_format = $this->check_pickone_content($params,$err_msg);
|
||
if(!$result_check_format && $err_msg){
|
||
return false;
|
||
}
|
||
$params["pickone_arr"] = $result_check_format;
|
||
}else{ //原有走的促销 普通 赠品
|
||
if($params['sales_material_type'] == 2){
|
||
if(!isset($params['at'])){
|
||
$err_msg ="组合物料请至少设置一个物料明细内容";
|
||
return false;
|
||
}
|
||
|
||
$basicM_bns = $tmp_at = $tmp_pr = array();
|
||
foreach ($params['at'] as $bn => $val){
|
||
if (count($params['at']) == 1){
|
||
if ($val <2){
|
||
$err_msg ="只有一种物料时,数量必须大于1";
|
||
return false;
|
||
}
|
||
}else {
|
||
if ($val < 1){
|
||
$err_msg ="数量必须大于0";
|
||
return false;
|
||
}
|
||
}
|
||
$basicInfo = $basicMaterialObj->getList('bm_id', array('material_bn'=>$bn), 0, 1);
|
||
if(!$basicInfo){
|
||
$err_msg ="找不到关联的基础物料";
|
||
return false;
|
||
}else{
|
||
$tmp_at[$basicInfo[0]['bm_id']] = $val;
|
||
$basicM_bns[$bn] = $basicInfo[0]['bm_id'];
|
||
}
|
||
}
|
||
unset($params['at']);
|
||
$params['at'] = $tmp_at;
|
||
|
||
foreach ($params['pr'] as $bn => $val){
|
||
$tmp_rate +=$val;
|
||
$tmp_pr[$basicM_bns[$bn]] = $val;
|
||
}
|
||
unset($params['pr']);
|
||
$params['pr'] = $tmp_pr;
|
||
|
||
if($tmp_rate > 100){
|
||
$err_msg ="分摊销售价合计百分比:".$tmp_rate.",已超100%";
|
||
return false;
|
||
}elseif($tmp_rate < 100){
|
||
$err_msg ="分摊销售价合计百分比:".$tmp_rate.",不足100%";
|
||
return false;
|
||
}
|
||
}else{
|
||
if(isset($params['bind_bn'])){
|
||
$basicInfo = $basicMaterialObj->getList('bm_id', array('material_bn'=>$params['bind_bn']), 0, 1);
|
||
if(!$basicInfo){
|
||
$err_msg ="找不到关联的基础物料";
|
||
return false;
|
||
}else{
|
||
$params['bind_bm_id'] = $basicInfo[0]['bm_id'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 添加
|
||
* @param mixed $data 数据
|
||
* @param mixed $code code
|
||
* @param mixed $sub_msg sub_msg
|
||
* @return mixed 返回值
|
||
*/
|
||
public function add($data,&$code,&$sub_msg){
|
||
$result = array('rsp'=>'succ');
|
||
|
||
if(!$this->_checkAddParams($data, $error_msg)){
|
||
$result['rsp'] = 'fail';
|
||
$result['msg'] = $error_msg;
|
||
return $result;
|
||
}
|
||
|
||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||
$salesMaterialExtObj = app::get('material')->model('sales_material_ext');
|
||
$salesMaterialShopFreezeObj = app::get('material')->model('sales_material_shop_freeze');
|
||
$formatFilter=kernel::single('openapi_format_abstract');
|
||
|
||
$shop_id = $data['shop_id'] ? $data['shop_id'] : '_ALL_';
|
||
//保存物料主表信息
|
||
$addData = array(
|
||
'sales_material_name' => $formatFilter->charFilter($data['sales_material_name']),
|
||
'sales_material_bn' => $formatFilter->charFilter($data['sales_material_bn']),
|
||
'sales_material_bn_crc32' => $data['sales_material_bn_crc32'],
|
||
'sales_material_type' => $data['sales_material_type'],
|
||
'shop_id' => $shop_id,
|
||
'create_time' => time(),
|
||
'tax_code' => $data['tax_code'],
|
||
'tax_name' => $data['tax_name'],
|
||
'tax_rate' => $data['tax_rate'],
|
||
);
|
||
$is_save = $salesMaterialObj->save($addData);
|
||
if($is_save){
|
||
$is_bind = false;
|
||
//如果有关联物料就做绑定操作
|
||
$salesBasicMaterialObj = app::get('material')->model('sales_basic_material');
|
||
//普通销售物料关联
|
||
if(($data['sales_material_type'] == 1 || $data['sales_material_type'] == 3 || $data['sales_material_type'] == 6) && !empty($data['bind_bm_id'])){
|
||
$addBindData = array(
|
||
'sm_id' => $addData['sm_id'],
|
||
'bm_id' => $data['bind_bm_id'],
|
||
'number' => 1,
|
||
);
|
||
$salesBasicMaterialObj->insert($addBindData);
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 2 && !empty($data['at'])){
|
||
//促销销售物料关联
|
||
foreach($data['at'] as $k=>$v){
|
||
$addBindData = array(
|
||
'sm_id' => $addData['sm_id'],
|
||
'bm_id' => $k,
|
||
'number' => $v,
|
||
'rate' => $data['pr'][$k],
|
||
);
|
||
$salesBasicMaterialObj->insert($addBindData);
|
||
$addBindData = null;
|
||
}
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 4 && !empty($data['luckybag_arr'])){ //福袋
|
||
$mdl_material_luckybag_rules = app::get('material')->model('luckybag_rules');
|
||
foreach($data['luckybag_arr'] as $var_lbr){
|
||
$addBindData = array(
|
||
"lbr_name" => $var_lbr["lbr_name"],
|
||
"sm_id" => $addData['sm_id'],
|
||
"bm_ids" => implode(",", $var_lbr["bm_ids"]),
|
||
"sku_num" => $var_lbr["sku_num"],
|
||
"send_num" => $var_lbr["send_num"],
|
||
"price" => $var_lbr["price"],
|
||
);
|
||
$mdl_material_luckybag_rules->insert($addBindData);
|
||
}
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 5 && !empty($data['pickone_arr'])){ //多选一
|
||
$mdl_material_pickone_rules = app::get('material')->model('pickone_rules');
|
||
foreach($data['pickone_arr'] as $var_dpa){
|
||
$addBindData = array(
|
||
"sm_id" => $addData['sm_id'],
|
||
"bm_id" => $var_dpa["bm_id"],
|
||
"sort" => $var_dpa["sort"],
|
||
"select_type" => $var_dpa["select_type"],
|
||
);
|
||
$mdl_material_pickone_rules->insert($addBindData);
|
||
}
|
||
$is_bind = true;
|
||
}
|
||
|
||
//如果有绑定物料数据,设定销售物料为绑定状态
|
||
if($is_bind){
|
||
$salesMaterialObj->update(array('is_bind'=>1),array('sm_id'=>$addData['sm_id']));
|
||
}
|
||
|
||
//保存销售物料扩展信息
|
||
$addExtData = array(
|
||
'sm_id' => $addData['sm_id'],
|
||
'cost' => $data['cost'] ? $data['cost'] : 0.00,
|
||
'retail_price' => $data['retail_price'] ? $data['retail_price'] : 0.00,
|
||
'weight' => $data['weight'] ? $data['weight'] : 0.00,
|
||
'unit' => $data['unit'],
|
||
);
|
||
$salesMaterialExtObj->insert($addExtData);
|
||
|
||
//保存销售物料店铺级冻结
|
||
if($shop_id != '_ALL_'){
|
||
$addStockData = array(
|
||
'sm_id' => $addData['sm_id'],
|
||
'shop_id' => $shop_id,
|
||
'shop_freeze' => 0,
|
||
);
|
||
$salesMaterialShopFreezeObj->insert($addStockData);
|
||
}
|
||
}else{
|
||
$result = array('msg'=>'销售物料添加失败', 'rsp'=>'fail');
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
|
||
/**
|
||
* 销售物料编辑时的参数检查方法
|
||
*
|
||
* @param Array $params
|
||
* @param String $err_msg
|
||
* @return Boolean
|
||
*/
|
||
function checkEditParams(&$params, &$err_msg){
|
||
|
||
if(empty($params['sales_material_name']) || empty($params['sales_material_bn'])){
|
||
$err_msg ="必填信息不能为空";
|
||
return false;
|
||
}
|
||
|
||
//去除空格
|
||
$params['sales_material_bn'] = trim($params['sales_material_bn']);
|
||
|
||
//销售物料信息
|
||
$basicMaterialObj = app::get('material')->model('basic_material');
|
||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||
$salesMaterialExistInfo = $salesMaterialObj->getList('*',array('sales_material_bn'=>$params['sales_material_bn']));
|
||
if(!$salesMaterialExistInfo){
|
||
$err_msg ="当前物料不存在";
|
||
return false;
|
||
}else{
|
||
$params['sm_id'] = $salesMaterialExistInfo[0]['sm_id'];
|
||
$params['old_sm_info'] = $salesMaterialExistInfo[0];
|
||
}
|
||
|
||
if($params['sales_material_type'] == 4){ //福袋
|
||
$result_check_format = $this->check_luckybag_content($params,$err_msg,true);
|
||
if(!$result_check_format && $err_msg){
|
||
return false;
|
||
}
|
||
$params["luckybag_arr"] = $result_check_format;
|
||
}elseif($params['sales_material_type'] == 5){ //多选一
|
||
$result_check_format = $this->check_pickone_content($params,$err_msg);
|
||
if(!$result_check_format && $err_msg){
|
||
return false;
|
||
}
|
||
$params["pickone_arr"] = $result_check_format;
|
||
}else{
|
||
$basicM_bns = $tmp_at = $tmp_pr = array();
|
||
if($params['sales_material_type'] == 2){
|
||
if(!isset($params['at'])){
|
||
$err_msg ="组合物料请至少设置一个物料明细内容";
|
||
return false;
|
||
}
|
||
|
||
foreach ($params['at'] as $bn => $val){
|
||
if (count($params['at']) == 1){
|
||
if ($val <2){
|
||
$err_msg ="只有一种物料时,数量必须大于1";
|
||
return false;
|
||
}
|
||
}else {
|
||
if ($val < 1){
|
||
$err_msg ="数量必须大于0";
|
||
return false;
|
||
}
|
||
}
|
||
$basicInfo = $basicMaterialObj->getList('bm_id', array('material_bn'=>$bn), 0, 1);
|
||
if(!$basicInfo){
|
||
$err_msg ="找不到关联的基础物料";
|
||
return false;
|
||
}else{
|
||
$tmp_at[$basicInfo[0]['bm_id']] = $val;
|
||
$basicM_bns[$bn] = $basicInfo[0]['bm_id'];
|
||
}
|
||
}
|
||
unset($params['at']);
|
||
$params['at'] = $tmp_at;
|
||
|
||
foreach ($params['pr'] as $bn => $val){
|
||
$tmp_rate +=$val;
|
||
$tmp_pr[$basicM_bns[$bn]] = $val;
|
||
}
|
||
unset($params['pr']);
|
||
$params['pr'] = $tmp_pr;
|
||
|
||
if($tmp_rate > 100){
|
||
$err_msg ="分摊销售价合计百分比:".$tmp_rate.",已超100%";
|
||
return false;
|
||
}elseif($tmp_rate < 100){
|
||
$err_msg ="分摊销售价合计百分比:".$tmp_rate.",不足100%";
|
||
return false;
|
||
}
|
||
}else{
|
||
if(isset($params['bind_bn'])){
|
||
$basicInfo = $basicMaterialObj->getList('bm_id', array('material_bn'=>$params['bind_bn']), 0, 1);
|
||
if(!$basicInfo){
|
||
$err_msg ="找不到关联的基础物料";
|
||
return false;
|
||
}else{
|
||
$params['bind_bm_id'] = $basicInfo[0]['bm_id'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 检查基础物料个别参数是否可编辑
|
||
*
|
||
* @param Int $bm_id
|
||
* @return Array
|
||
*/
|
||
function checkEditReadOnly($shop_id, $sm_id, $is_bind){
|
||
$readonly = array('type' => false,'shop'=>false,'bind_item'=>false);
|
||
|
||
//如果销售物料有冻结、订单,那么物料类型不能变
|
||
if($shop_id != '_ALL_'){
|
||
$shopFreezeObj = app::get('material')->model('sales_material_shop_freeze');
|
||
$storeInfo = $shopFreezeObj->getList('shop_freeze',array('sm_id'=>$sm_id,'shop_id'=>$shop_id));
|
||
if($storeInfo[0]['shop_freeze'] > 0){
|
||
$is_type_readonly = true;
|
||
}
|
||
}
|
||
|
||
$orderObjObj = app::get('ome')->model('order_objects');
|
||
$orderInfo = $orderObjObj->getList('obj_id,goods_id',array('goods_id'=>$sm_id));
|
||
if($orderInfo){
|
||
$has_object = true;
|
||
$is_type_readonly = true;
|
||
$is_shop_readonly = true;
|
||
}
|
||
|
||
if($is_type_readonly){
|
||
$readonly['type'] = true;
|
||
}
|
||
|
||
if($is_shop_readonly){
|
||
$readonly['shop'] = true;
|
||
}
|
||
|
||
//已绑定有订单的不能变
|
||
if($is_bind == 1 && $has_object == true){
|
||
$orderItemObj = app::get('ome')->model('order_items');
|
||
$orderItemInfo = $orderItemObj->db->select("select item_id from sdb_ome_order_items as oi left join sdb_ome_order_objects as oo on oi.obj_id = oo.obj_id where goods_id = ".$sm_id." LIMIT 0,1");
|
||
if($orderItemInfo){
|
||
$is_bind_item_readonly = true;
|
||
}
|
||
}
|
||
|
||
if($is_bind_item_readonly){
|
||
$readonly['bind_item'] = true;
|
||
}
|
||
|
||
return $readonly;
|
||
}
|
||
|
||
/**
|
||
* edit
|
||
* @param mixed $data 数据
|
||
* @param mixed $code code
|
||
* @param mixed $sub_msg sub_msg
|
||
* @return mixed 返回值
|
||
*/
|
||
public function edit($data,&$code,&$sub_msg){
|
||
$result = array('rsp'=>'succ');
|
||
|
||
if(!$this->checkEditParams($data, $error_msg)){
|
||
$result['rsp'] = 'fail';
|
||
$result['msg'] = $error_msg;
|
||
return $result;
|
||
}
|
||
|
||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||
$salesMaterialExtObj = app::get('material')->model('sales_material_ext');
|
||
|
||
//检查物料是否有关联的订单,关联的基础物料不能改变
|
||
$readonly = $this->checkEditReadOnly($data['old_sm_info']['shop_id'], $data['sm_id'], $data['old_sm_info']['is_bind']);
|
||
$data['sales_material_type'] = $readonly['type'] ? $data['old_sm_info']['sales_material_type'] : $data['sales_material_type'];
|
||
$data['shop_id'] = $readonly['shop'] ? $data['old_sm_info']['shop_id'] : '_ALL_';
|
||
|
||
//更新基础物料基本信息
|
||
$updateData['sales_material_name'] = $data['sales_material_name'];
|
||
$updateData['sales_material_type'] = $data['sales_material_type'];
|
||
$updateData['shop_id'] = $data['shop_id'];
|
||
|
||
if($data['tax_code']){
|
||
$updateData['tax_code'] = $data['tax_code'];
|
||
}
|
||
if($data['tax_name']){
|
||
$updateData['tax_name'] = $data['tax_name'];
|
||
}
|
||
if($data['tax_rate']){
|
||
$updateData['tax_rate'] = $data['tax_rate'];
|
||
}
|
||
$filter['sm_id'] = $data['sm_id'];
|
||
|
||
$is_update = $salesMaterialObj->update($updateData,$filter);
|
||
if($is_update){
|
||
$is_bind = false;
|
||
//如果有关联物料就做绑定操作
|
||
$salesBasicMaterialObj = app::get('material')->model('sales_basic_material');
|
||
|
||
//如果销售物料有对应订单,则不允许删除关联的基础物料信息
|
||
if(!$readonly['bind_item']){
|
||
//删除原有关联基础物料信息
|
||
$salesBasicMaterialObj->delete(array('sm_id'=>$filter['sm_id']));
|
||
//多选一 先删除原有的 加新的
|
||
$mdl_material_pickone_rules = app::get('material')->model('pickone_rules');
|
||
$rs_pickone_old = $mdl_material_pickone_rules->dump(array("sm_id"=>$filter['sm_id']));
|
||
if(!empty($rs_pickone_old)){
|
||
$mdl_material_pickone_rules->delete(array("sm_id" => $filter['sm_id']));
|
||
}
|
||
}
|
||
|
||
|
||
//目前如果编辑时sales_material_type不是4福袋 原销售物料时福袋 删除原有的福袋数据
|
||
$mdl_material_luckybag_rules = app::get('material')->model('luckybag_rules');
|
||
if($data['sales_material_type'] != 4){
|
||
$rs_old_luckybag = $mdl_material_luckybag_rules->dump(array("sm_id"=>$filter['sm_id']));
|
||
if(!empty($rs_old_luckybag)){ //有旧的福袋数据删除sm_id对应的所有lbr数据
|
||
$mdl_material_luckybag_rules->delete(array("sm_id"=>$filter['sm_id']));
|
||
}
|
||
}
|
||
|
||
//普通销售物料关联
|
||
if(($data['sales_material_type'] == 1 || $data['sales_material_type'] == 3 || $data['sales_material_type'] == 6) && (!$readonly['bind_item']) && !empty($data['bind_bm_id'])){
|
||
$addBindData = array(
|
||
'sm_id' => $filter['sm_id'],
|
||
'bm_id' => $data['bind_bm_id'],
|
||
'number' => 1,
|
||
);
|
||
$salesBasicMaterialObj->insert($addBindData);
|
||
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 2 && (!$readonly['bind_item']) && !empty($data['at'])){
|
||
//促销销售物料关联
|
||
foreach($data['at'] as $k=>$v){
|
||
$addBindData = array(
|
||
'sm_id' => $filter['sm_id'],
|
||
'bm_id' => $k,
|
||
'number' => $v,
|
||
'rate' => $data['pr'][$k],
|
||
);
|
||
$salesBasicMaterialObj->insert($addBindData);
|
||
$addBindData = null;
|
||
}
|
||
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 4 && !$readonly['bind_item'] && !empty($data['luckybag_arr'])){ //福袋
|
||
//这里根据sm_id和lbr_name判断是否存在此组合 存在更新 不存在新增 多余的删除
|
||
$rs_luckybag_list = $mdl_material_luckybag_rules->getList("lbr_id,lbr_name",array("sm_id"=>$filter['sm_id']));
|
||
if(empty($rs_luckybag_list)){ //修改sales_material_type为4过来的 做新增
|
||
foreach($data['luckybag_arr'] as $var_lbr){
|
||
$addBindData = array(
|
||
"lbr_name" => $var_lbr["lbr_name"],
|
||
"sm_id" => $filter['sm_id'],
|
||
"bm_ids" => implode(",", $var_lbr["bm_ids"]),
|
||
"sku_num" => $var_lbr["sku_num"],
|
||
"send_num" => $var_lbr["send_num"],
|
||
"price" => $var_lbr["price"],
|
||
);
|
||
$mdl_material_luckybag_rules->insert($addBindData);
|
||
}
|
||
}else{ //做更新
|
||
$lbr_name_arr = array();
|
||
foreach($data['luckybag_arr'] as $var_lbr){
|
||
$lbr_name_arr[] = $var_lbr["lbr_name"];
|
||
}
|
||
$del_lbr_id_arr = array();
|
||
foreach($rs_luckybag_list as $var_rll){
|
||
if(!in_array($var_rll["lbr_name"],$lbr_name_arr)){
|
||
$del_lbr_id_arr[] = $var_rll["lbr_id"];
|
||
}
|
||
}
|
||
if(!empty($del_lbr_id_arr)){
|
||
$mdl_material_luckybag_rules->delete(array("lbr_id"=>$del_lbr_id_arr));
|
||
}
|
||
foreach($data['luckybag_arr'] as $var_lbr_v2){
|
||
$filter_arr = array("lbr_name"=>$var_lbr_v2["lbr_name"],"sm_id"=>$filter['sm_id']);
|
||
$rs_lkb_info = $mdl_material_luckybag_rules->dump($filter_arr,"lbr_id");
|
||
if(empty($rs_lkb_info)){ //新增的
|
||
$addBindData = array(
|
||
"lbr_name" => $var_lbr_v2["lbr_name"],
|
||
"sm_id" => $filter['sm_id'],
|
||
"bm_ids" => implode(",", $var_lbr_v2["bm_ids"]),
|
||
"sku_num" => $var_lbr_v2["sku_num"],
|
||
"send_num" => $var_lbr_v2["send_num"],
|
||
"price" => $var_lbr_v2["price"],
|
||
);
|
||
$mdl_material_luckybag_rules->insert($addBindData);
|
||
}else{
|
||
$update_arr = array(
|
||
"bm_ids" => implode(",", $var_lbr_v2["bm_ids"]),
|
||
"sku_num" => $var_lbr_v2["sku_num"],
|
||
"send_num" => $var_lbr_v2["send_num"],
|
||
"price" => $var_lbr_v2["price"],
|
||
);
|
||
$mdl_material_luckybag_rules->update($update_arr,$filter_arr);
|
||
}
|
||
}
|
||
}
|
||
$is_bind = true;
|
||
}elseif($data['sales_material_type'] == 5 && !$readonly['bind_item'] && !empty($data['pickone_arr'])){ //多选一
|
||
$mdl_material_pickone_rules = app::get('material')->model('pickone_rules');
|
||
foreach($data['pickone_arr'] as $var_dpa){
|
||
$addBindData = array(
|
||
"sm_id" => $filter['sm_id'],
|
||
"bm_id" => $var_dpa["bm_id"],
|
||
"sort" => $var_dpa["sort"],
|
||
"select_type" => $var_dpa["select_type"],
|
||
);
|
||
$mdl_material_pickone_rules->insert($addBindData);
|
||
}
|
||
$is_bind = true;
|
||
}
|
||
|
||
if($readonly['bind_item']){ //如果该销售物料有订单的
|
||
$is_bind = true;
|
||
}
|
||
|
||
//如果有绑定物料数据或者有订单的,设定销售物料为绑定状态
|
||
if($is_bind){
|
||
$salesMaterialObj->update(array('is_bind'=>1),array('sm_id'=>$filter['sm_id']));
|
||
}else{
|
||
$salesMaterialObj->update(array('is_bind'=>2),array('sm_id'=>$filter['sm_id']));
|
||
}
|
||
|
||
//更新销售物料扩展信息
|
||
$updateExtData = array(
|
||
'cost' => $data['cost'] ? $data['cost'] : 0.00,
|
||
'retail_price' => $data['retail_price'] ? $data['retail_price'] : 0.00,
|
||
'weight' => $data['weight'] ? $data['weight'] : 0.00,
|
||
'unit' => $data['unit'],
|
||
);
|
||
$salesMaterialExtObj->update($updateExtData, $filter);
|
||
}else{
|
||
$result = array('msg'=>'销售物料更新失败', 'rsp'=>'fail');
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
//检查填写的福袋组合信息格式内容
|
||
private function check_luckybag_content($params,&$err_msg,$edit=false){
|
||
if(!is_numeric($params["retail_price"]) || $params["retail_price"]< 0){
|
||
$err_msg = "销售价必须是大于等于0的数字";return false;
|
||
}
|
||
$luckybag_bind_info = trim($params["luckybag_bind_info"]);
|
||
if(!$luckybag_bind_info){
|
||
$err_msg = "福袋类关联物料信息不能为空";return false;
|
||
}
|
||
$bm_ids_record = array();
|
||
$return_luckybag_rules = array();
|
||
$arr_lbr_name = array();
|
||
$reg_number = "/^[1-9][0-9]*$/";
|
||
$luckybag_total_price = 0;
|
||
$basicMaterialObj = app::get('material')->model('basic_material');
|
||
$tmp_luckybag_rules = explode('#', $luckybag_bind_info);
|
||
foreach($tmp_luckybag_rules as $var_tlr){
|
||
$current_bm_ids = array();
|
||
$tmp_luckybag_name = explode(':', $var_tlr);
|
||
if(count($tmp_luckybag_name) == 2){
|
||
if(!$tmp_luckybag_name[0]){
|
||
$err_msg = "福袋组合名称异常";break;
|
||
}
|
||
if(!$tmp_luckybag_name[1]){
|
||
$err_msg = "福袋组合内容异常";break;
|
||
}
|
||
if(in_array($tmp_luckybag_name[0],$arr_lbr_name)){
|
||
$err_msg = "组合名称不能相同";break;
|
||
}else{
|
||
$arr_lbr_name[] = $tmp_luckybag_name[0];
|
||
}
|
||
$tmp_luckybag_detail = explode('-', $tmp_luckybag_name[1]);
|
||
if(count($tmp_luckybag_detail) == 2){
|
||
if(!$tmp_luckybag_detail[0]){
|
||
$err_msg = $tmp_luckybag_name[0].":的福袋组合基础物料异常";break;
|
||
}
|
||
if(!$tmp_luckybag_detail[1]){
|
||
$err_msg = $tmp_luckybag_name[0].":的福袋组合规则参数异常";break;
|
||
}
|
||
$luckybag_bm_bns = explode("|", $tmp_luckybag_detail[0]);
|
||
$rs_bm_ids = $basicMaterialObj->getList("bm_id",array("material_bn"=>$luckybag_bm_bns));
|
||
if(empty($rs_bm_ids)){
|
||
$err_msg = $tmp_luckybag_name[0].":的福袋组合基础物料不存在";break;
|
||
}
|
||
if(count($rs_bm_ids) < count($luckybag_bm_bns)){
|
||
$err_msg = $tmp_luckybag_name[0].":的福袋组合基础物料编码重复或不存在";break;
|
||
}
|
||
$luckybag_params = explode("|", $tmp_luckybag_detail[1]);
|
||
if(count($luckybag_params) != 3){
|
||
$err_msg = $tmp_luckybag_name[0].":的福袋组合参数异常";break;
|
||
}
|
||
$duplicate_bm_id_flag = false;
|
||
foreach($rs_bm_ids as $var_bi){
|
||
if(in_array($var_bi["bm_id"],$bm_ids_record)){
|
||
$duplicate_bm_id_flag = true;break;
|
||
}else{
|
||
$current_bm_ids[] = $var_bi["bm_id"]; //当前组合
|
||
$bm_ids_record[] = $var_bi["bm_id"]; //所有组合
|
||
}
|
||
}
|
||
if($duplicate_bm_id_flag){
|
||
$err_msg = "所有组合中基础物料不得重复";break;
|
||
}
|
||
if(!preg_match($reg_number,$luckybag_params[0])){
|
||
$err_msg = $tmp_luckybag_name[0].":sku数必须是大于0的整数";break;
|
||
}
|
||
if(!preg_match($reg_number,$luckybag_params[1])){
|
||
$err_msg = $tmp_luckybag_name[0].":送件数必须是大于0的整数";break;
|
||
}
|
||
if($luckybag_params[0] > count($current_bm_ids)){
|
||
$err_msg = $tmp_luckybag_name[0].":sku数不得大于当前基础物料sku数量";break;
|
||
}
|
||
if(!is_numeric($luckybag_params[2]) || $luckybag_params[2] < 0){
|
||
$err_msg = $tmp_luckybag_name[0].":单品售价必须是大于等于0的数字";break;
|
||
}
|
||
$luckybag_total_price = $luckybag_total_price + ($luckybag_params[0]*$luckybag_params[1]*$luckybag_params[2]);
|
||
//当前组合检查完成赋值
|
||
$return_luckybag_rules[] = array(
|
||
"lbr_name" => $tmp_luckybag_name[0],
|
||
"bm_ids" => $current_bm_ids,
|
||
"sku_num" => $luckybag_params[0],
|
||
"send_num" => $luckybag_params[1],
|
||
"price" => $luckybag_params[2],
|
||
);
|
||
}else{
|
||
$err_msg = $tmp_luckybag_name[0]."格式错误";break;
|
||
}
|
||
}else{
|
||
$err_msg = "福袋类关联物料信息错误";break;
|
||
}
|
||
}
|
||
|
||
if($err_msg){
|
||
return false;
|
||
}else{
|
||
if($params["retail_price"] != $luckybag_total_price){
|
||
$err_msg = "售价和组合总和售价必须相等";return false;
|
||
}
|
||
$filter_luckybag_exists = array("lbr_name"=>$arr_lbr_name);
|
||
if($edit){ //编辑
|
||
$filter_luckybag_exists["sm_id|noequal"] = $params['sm_id'];
|
||
}
|
||
$mdl_material_luckybag_rules = app::get('material')->model('luckybag_rules');
|
||
$rs_lbr = $mdl_material_luckybag_rules->getList("lbr_name",$filter_luckybag_exists);
|
||
if(!empty($rs_lbr)){
|
||
$exist_lbr_names = array();
|
||
foreach($rs_lbr as $var_r_l){
|
||
$exist_lbr_names[] = $var_r_l["lbr_name"];
|
||
}
|
||
$err_msg = "组合:".implode(",",$exist_lbr_names)."已经存在";return false;
|
||
}
|
||
return $return_luckybag_rules;
|
||
}
|
||
|
||
}
|
||
|
||
//检查填写的多选一信息格式内容
|
||
private function check_pickone_content($params,&$err_msg,$edit=false){
|
||
if(!is_numeric($params["retail_price"]) || $params["retail_price"]< 0){
|
||
$err_msg = "销售价必须是大于等于0的数字";return false;
|
||
}
|
||
$pickone_bind_info = trim($params["pickone_bind_info"]);
|
||
if(!$pickone_bind_info){
|
||
$err_msg = "多选一类关联物料信息不能为空";return false;
|
||
}
|
||
$return_pickone_rules = array();
|
||
$reg_number = "/^[1-9][0-9]*$/";
|
||
$basicMaterialObj = app::get('material')->model('basic_material');
|
||
//随机#a1:0|a2:0
|
||
$tmp_pickone_rules = explode('#',$pickone_bind_info);
|
||
if(count($tmp_pickone_rules) == 2){
|
||
$select_type_arr = array("随机","排序");
|
||
if(!in_array($tmp_pickone_rules[0],$select_type_arr)){
|
||
$err_msg = "多选一类关联物料信息选择方式填写错误";return false;
|
||
}
|
||
$select_type = 1;
|
||
if($tmp_pickone_rules[0] == "排序"){
|
||
$select_type = 2;
|
||
}
|
||
$arr_pickone_data = explode("|",$tmp_pickone_rules[1]);
|
||
if(count($arr_pickone_data) < 2){
|
||
$err_msg = "多选一类关联物料信息中基础物料sku数量必须大于2种";return false;
|
||
}
|
||
$arr_basic_ma_bn = array();
|
||
foreach($arr_pickone_data as $var_apd){
|
||
$arr_pickone_item_data = explode(":",$var_apd);
|
||
if(count($arr_pickone_item_data) != 2){
|
||
$err_msg = "多选一类关联物料信息中基础物料sku和排序值填写有误";break;
|
||
}
|
||
if(in_array($arr_pickone_item_data[0],$arr_basic_ma_bn)){
|
||
$err_msg = "多选一类关联物料信息中基础物料sku已重复";break;
|
||
}
|
||
$rs_bm_id = $basicMaterialObj->dump(array("material_bn"=>$arr_pickone_item_data[0]),"bm_id");
|
||
if(empty($rs_bm_id)){
|
||
$err_msg = "多选一类关联物料信息中基础物料".$arr_pickone_item_data[0]."不存在";break;
|
||
}
|
||
$arr_basic_ma_bn[] = $arr_pickone_item_data[0];
|
||
if(!is_numeric($arr_pickone_item_data[1])){
|
||
$err_msg = "多选一类关联物料信息中排序值必须是数值";break;
|
||
}
|
||
$return_pickone_rules[] = array(
|
||
"bm_id" => $rs_bm_id["bm_id"],
|
||
"sort" => $arr_pickone_item_data[1],
|
||
"select_type" => $select_type,
|
||
);
|
||
}
|
||
if($err_msg){
|
||
return false;
|
||
}
|
||
}else{
|
||
$err_msg = "多选一类关联物料信息错误";return false;
|
||
}
|
||
return $return_pickone_rules;
|
||
}
|
||
|
||
} |