文件
mashangyoujiu/Application/Common/Business/WarehouseOperation.class.php

460 行
21 KiB
PHP
可执行文件

<?php
namespace Common\Business;
use Common\Model\SaleMGoodsModel;
use Common\Model\SSaleMGoodsModel;
use Common\Model\SStockOutOrderModel;
use Common\Model\WarehousingGoodsModel;
use Common\Model\WarehousingRecordModel;
//[1.7.90]
/**
* 入库操作类
* Class WarehouseOperation
* [
* 商户端门店退货的入库操作 retreatWarehousing
* 门店入库商品验证 goodsListVerify
* 单品验证 goodsVerify
* 货号条码验证 codeVerify
* ]
* @package Common\Business
*/
class WarehouseOperation
{
/**
* 商户端门店退货的操作
* operator_id 操作人
* $merchant_id 商户id
* $store_id 退货的门店id
* $id 入库单Id
* $order_number 入库单号
* $goodsList 入库商品
* $warehouse_id 供给仓库id
* $remarks 备注
* bool 返回
* bool
* @param $param
* @return bool
*/
public function retreatWarehousing($param)
{
$id = $param['id'];
$order_number = $param['order_number'];
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
if (is_array($param['goodsList'])) {
$goodsList = $param['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
}
if (empty($param['warehouse_id'])) {
$WarehouseClass = new Warehouse();
$warehouseResult = $warehouse_id = $WarehouseClass->getSaleWarehouseId([
'user_type' => 3,
'merchant_id' => $merchant_id
]);
if (empty($warehouseResult['data'])) {
return ['status' => 0, 'msg' => '请创建供给仓库'];
}
$warehouse_id = $warehouseResult['data'];
} else {
$warehouse_id = $param['warehouse_id'];
}
if (empty($id) || empty($goodsList) || empty($order_number) || empty($merchant_id) || empty($store_id)) {
return ['status' => 0, 'msg' => '缺少必要参数'];
}
$time = $_SERVER['REQUEST_TIME'];
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
try{
$SaleMGoodsModel = new SaleMGoodsModel();
foreach ($goodsList as $key => &$val) {
if (!$val['warehouse_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!preg_match($reg1, $val['warehouse_price'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if ($val['attribute_state'] == 1) {
if ($val['pricing_method'] == 1) {
//无称重
if (!preg_match($reg3, $val['warehouse_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['warehouse_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['warehouse_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['warehouse_num'] > $val['stock_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '入库数量不能大于辅助数量'];
}
$m_where = [];
if ($val['attribute_state'] == 2) {
//规格
$m_where['sku_goods_number'] = $val['sku_goods_number'];
} else {
//无规格
$m_where['goods_number'] = $val['goods_number'];
}
$m_where['status'] = array('in', '0,1');
$m_where['merchant_id'] = $merchant_id;
$m_goods_count = $SaleMGoodsModel->getCount($m_where);
if ($m_goods_count > 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '存在货号相同的商品'];
} else if ($m_goods_count == 1) {
$m_goods_info = D('SaleMGoods')->getFind($m_where);
if ($m_goods_info['attribute_state'] != $val['attribute_state']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '规格类型不同'];
}
//存在某商品
if ($val['attribute_state'] == 2) {
if (empty($val['sku_id_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '规格信息错误'];
}
$m_sku_ids = explode(',', $m_goods_info['sku_id_list']);
$s_sku_ids = explode(',', $val['sku_id_list']);
$sku_list_diff = array_diff($s_sku_ids, $m_sku_ids);
if (!empty($sku_list_diff)) {
return ['status' => 0, 'msg' => '商品' . $val['goods_name'] . $val['sku_name'] . '与门店' . '规格不同'];
}
}
} else {
return ['status' => 0, 'msg' => '未能通过' . $val['goods_name'] . $val['sku_name'] . '商品货号找到此商品'];
}
$m_goods_code_count = 0; //相同条码的商品数
if ($val['attribute_state'] == 2) {
if (!empty($val['sku_code'])) {
unset($m_where['sku_goods_number']);
$m_where['sku_code'] = $val['sku_code'];
$m_goods_code_count = D('SaleMGoods')->getCount($m_where);
}
} else {
if (!empty($val['goods_code'])) {
unset($m_where['goods_number']);
$m_where['goods_code'] = $val['goods_code'];
$m_goods_code_count = D('SaleMGoods')->getCount($m_where);
}
}
if ($m_goods_code_count > 1) {
return ['status'=>0,'msg'=>'商品' . $val['goods_name'] . $val['sku_name'] . '与门店' . '存在条码重复'];
}
//串号信息判断
if($val['serial_number_state'] == 1 && count($val['serial_list']) != $val['warehouse_num']){
return ['status'=>0,'msg'=>'入库数量与串号信息不匹配'];
}
}
//操作
M()->startTrans();
$WarehousingGoodsModel = new WarehousingGoodsModel();
$SerialClass = new SerialNumberGoods();
$money_total = 0;
foreach ($goodsList as $key => &$val) {
$m_where = [];
if ($val['attribute_state'] == 2) {
$m_where['sku_goods_number'] = $val['sku_goods_number'];
} else {
$m_where['goods_number'] = $val['goods_number'];
}
$m_where['status'] = array('in', '0,1');
$m_where['merchant_id'] = $merchant_id;
$m_goods_info = $SaleMGoodsModel->getFind($m_where);
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'warehouse_record_id' => $id,
'goods_class_id' => $m_goods_info['goods_class_id'],
'goods_id' => $m_goods_info['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $m_goods_info['goods_number'],
'goods_code' => $m_goods_info['goods_code'],
'company' => $val['company'],
'attribute_state' => $m_goods_info['attribute_state'],
'pricing_method' => $m_goods_info['pricing_method'],
'sku_num' => round($val['sku_num'], 3),
'warehouse_price' => round($val['warehouse_price'], 2),
'warehouse_num' => round($val['warehouse_num'], 3),
'surplus_num' => round($val['warehouse_num'], 3),
'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'], 2),
'remarks' => $val['remarks'],
'warehouse_order_number' => $order_number,
'type' => 4,
'add_time' => $time,
'serial_number_state'=>$val['serial_number_state']?$val['serial_number_state']:0
];
if($m_goods_info['attribute_state'] == 2){
$data['sku_id'] = $m_goods_info['sku_id'];
$data['sku_name'] = $val['sku_name'];
$data['sku_id_list'] = $val['sku_id_list'];
$data['sku_goods_number'] = $m_goods_info['sku_goods_number'];
$data['sku_code'] = $m_goods_info['sku_code'];
}
$res = $WarehousingGoodsModel->addData($data); //入库记录
if ($res['status'] == 0) {
M()->rollback();
return ['status'=>0,'msg'=>'入库记录添加失败'];
}
//串号信息
if($val['serial_number_state'] == 1){
$serialResult = $SerialClass->warehouseSerial([
'user_type'=>3,
'merchant_id'=>$merchant_id,
'outside_id'=>$res['data'],
'goods_id'=>$m_goods_info['goods_id'],
'sku_id'=>$m_goods_info['sku_id'],
'type'=>4,
'add_time'=>$time,
'serial_list'=>$val['serial_list']
]);
if($serialResult['status'] != 1){
M()->rollback();
return ['status'=>0,'msg'=>'串号保存失败'];
}
}
$money_total += $data['subtotal'];
$map = [
'merchant_id'=>$merchant_id,
'warehouse_id'=>$warehouse_id,
'goods_id'=>$m_goods_info['goods_id']
];
if ($val['attribute_state'] == 2) {
$map['sku_id'] = $m_goods_info['sku_id'];
}
$val['goods_id'] = $m_goods_info['goods_id'];
$val['goods_class_id'] = $m_goods_info['goods_class_id'];
$val['warehouse_num'] = round($val['warehouse_num'], 3);
$val['warehouse_price'] = round($val['warehouse_price'], 2);
$val['add_time'] = $time;
A('Api/Inventory')->MerGoodsStockOperation($map, $val);//数量与成本价操作
}
//门店入库单状态修改
$text = [
'real_goods_species'=>count($goodsList),
'real_money_total'=>$money_total,
'add_time'=>$time,
'status'=>1,
'remarks'=>$param['remarks'],
'operator_id'=>$param['operator_id']
];
$WarehousingRecordModel = new WarehousingRecordModel();
$success = $WarehousingRecordModel->updateData(array('id' => $id), $text);
if (!$success) {
M()->rollback();
return ['status'=>0,'msg'=>'订单状态修改失败'];
}
$SStockOutOrderModel = new SStockOutOrderModel();
$real_data = [
'warehousing_status'=>1,
'warehouse_time'=>$time,
'real_goods_species'=>count($goodsList),
'real_money_total'=>$money_total,
];
$result = $SStockOutOrderModel->updateData(array('warehouse_record_id' => $id, 'type' => 1), $real_data);
if ($result['status'] != 1) {
M()->rollback();
return ['status'=>0,'msg'=>'商户调拨单状态修改失败'];
}
M()->commit();
return ['status'=>1,'msg'=>'操作成功'];
}catch (\Exception $e){
return ['status'=>1,'msg'=>'操作失败'];
}
}
/*
*门店入库商品验证 (用于门店处理调拨进来的商品验证)
*@param $merchant_id 商户id
*@param $store_id 门店id
*@param $goodsList 入库的商品信息
*/
public function goodsListVerify($merchant_id, $store_id, $goodsList)
{
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
$goodsIds = array(); //未找到的商品信息
foreach ($goodsList as $key => $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确保质期";
return $res;
}
if (!$val['warehouse_price']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确价格";
return $res;
}
if (!preg_match($reg1, $val['warehouse_price'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确价格";
return $res;
}
if ($val['attribute_state'] == 1) {
if (!preg_match($reg2, $val['warehouse_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确数量";
return $res;
}
} else {
if (!preg_match($reg3, $val['warehouse_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
return $res;
}
}
if ($val['warehouse_num'] > $val['stock_num']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "入库数量不能大于辅助数量";
return $res;
}
$verifyResult = $this->goodsVerify($merchant_id, $store_id, $val); //单品验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (!empty($verifyResult['data']) && !in_array($goodsList[$key]['goods_id'], $goodsIds)) {
array_push($goodsIds, $goodsList[$key]['goods_id']);
}
}
if (!empty($goodsIds)) {
$res['status'] = 3;
$res['goodsIds'] = $goodsIds;
$res['msg'] = "有" . count($goodsIds) . "条商品信息不存在,是否一键同步商品信息到门店";
return $res;
}
return callBack(statusCode()['success'], "验证成功");
}
/**
* 单品验证
* @param $merchant_id
* @param $store_id
* @param $goods_info
* @return mixed
*/
public function goodsVerify($merchant_id, $store_id, $goods_info)
{
$where = [];
$add_goods_id = '';
if ($goods_info['attribute_state'] == 2) {
//规格
$where['sku_goods_number'] = $goods_info['sku_goods_number'];
} else {
//无规格
$where['goods_number'] = $goods_info['goods_number'];
}
$where['status'] = ['in', '0,1'];
$where['store_id'] = $store_id;
$where['merchant_id'] = $merchant_id;
$SaleGoods = new SSaleMGoodsModel();
$s_goods_count = $SaleGoods->getCount($where);
if ($s_goods_count > 1) {
//货号相同
return callBack(statusCode()['error'], $goods_info['goods_name'] . $goods_info['sku_name'] . "存在货号相同的情况");
} else if ($s_goods_count == 1) {
//存在这个货号的商品
$s_goods_info = $SaleGoods->getFind($where);
if ($s_goods_info['attribute_state'] != $goods_info['attribute_state']) {
return callBack(statusCode()['error'], $goods_info['goods_name'] . $goods_info['sku_name'] . "规格类型不同");
}
if ($s_goods_info['serial_number_state'] != $goods_info['serial_number_state']) {
return callBack(statusCode()['error'], $goods_info['goods_name'] . $goods_info['sku_name'] . "串号类型不同");
}
$codeVerify = $this->codeVerify($merchant_id, $store_id, $goods_info, $s_goods_info); //货号条码验证
if ($codeVerify['status'] != 1) {
return $codeVerify;
}
//规格属性验证
if ($goods_info['attribute_state'] == 2) {
if (empty($goods_info['sku_id_list'])) {
return callBack(statusCode()['error'], $goods_info['goods_name'] . $goods_info['sku_name'] . "规格信息错误");
}
$s_sku_ids = explode(',', $s_goods_info['sku_id_list']);
$m_sku_ids = explode(',', $goods_info['sku_id_list']);
$sku_list_diff = array_diff($m_sku_ids, $s_sku_ids);
if (!empty($sku_list_diff)) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '规格属性不同');
}
}
} else {
$codeVerify = $this->codeVerify($merchant_id, $store_id, $goods_info, []); //货号条码验证
if ($codeVerify['status'] != 1) {
return $codeVerify;
}
$add_goods_id = $goods_info['goods_id'];
}
return callBack(statusCode()['success'], "验证成功", $add_goods_id);
}
/**
* 条码验证
* @param $merchant_id
* @param $store_id
* @param $goods_info 入库的商品信息
* @param $s_goods_info 存在的商品信息
* @return mixed
*/
public function codeVerify($merchant_id, $store_id, $goods_info, $s_goods_info)
{
$where = [
'status' => ['in', '0,1'],
'store_id' => $store_id,
'merchant_id' => $merchant_id
];
$s_goods_code_count = 0;
$s_goods_number_count = 0;
$SaleGoodsModel = new SSaleMGoodsModel();
if ($goods_info['attribute_state'] == 2) {
if (!empty($s_goods_info)) {
//已经存在该货号商品
$where['sku_id'] = array('neq', $s_goods_info['sku_id']);
}
//条码验证
if (!empty($goods_info['sku_code'])) {
$where['sku_code'] = $goods_info['sku_code'];
$s_goods_code_count = $SaleGoodsModel->getCount($where);
}
if (!empty($s_goods_info['sku_code']) && !empty($goods_info['sku_code']) && ($s_goods_info['sku_code'] != $goods_info['sku_code'])) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '存在规格条码不一样');
}
//货号验证
if (!empty($goods_info['sku_goods_number'])) {
unset($where['sku_code']);
$where['sku_goods_number'] = $goods_info['sku_goods_number'];
$s_goods_number_count = $SaleGoodsModel->getCount($where);
}
if ($s_goods_number_count >= 1) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '存在规格货号重复');
}
if (!empty($s_goods_info['sku_goods_number']) && !empty($goods_info['sku_goods_number']) && ($s_goods_info['sku_goods_number'] != $goods_info['sku_goods_number'])) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '存在规格货号不一样');
}
} else {
if (!empty($goods_info['goods_code'])) {
$where['goods_code'] = $goods_info['goods_code'];
if (!empty($s_goods_info)) {
$where['goods_id'] = array('neq', $s_goods_info['goods_id']);
}
$s_goods_code_count = $SaleGoodsModel->getCount($where);
}
if (!empty($s_goods_info['goods_code']) && !empty($goods_info['goods_code']) && ($s_goods_info['goods_code'] != $goods_info['goods_code'])) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '存在条码不一样');
}
}
if ($s_goods_code_count >= 1) {
return callBack(statusCode()['error'], '商品' . $goods_info['goods_name'] . $goods_info['sku_name'] . '与门店' . '存在条码重复');
}
return callBack(statusCode()['success'], "条码验证通过");
}
}