文件
mashangyoujiu/Application/Api/Controller/InventoryController.class.php

7955 行
343 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Api\Controller;
use Common\Business\CacheHandle;
use Common\Business\Goods;
use Common\Business\InventoryOperation;
use Common\Business\InventorySet;
use Common\Business\LabelInventory;
use Common\Business\RefuseWarehousing;
use Common\Business\Sell;
use Common\Business\SerialNumberGoods;
use Common\Business\UnitLibrary;
use Common\Business\Warehouse;
use Common\Business\WarehouseOperation;
use Common\Model\AdvanceGoodsModel;
use Common\Model\AdvanceSkuGoodsModel;
use Common\Model\CostPriceRecordModel;
use Common\Model\LossReportGoodsModel;
use Common\Model\LossReportOrderModel;
use Common\Model\MGoodsModel;
use Common\Model\PurchaseRetreatOrderModel;
use Common\Model\RetailBillAdvanceModel;
use Common\Model\RetailBillOnlineModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailSellModel;
use Common\Model\RetailStoreModel;
use Common\Model\RetreatGoodsModel;
use Common\Model\RetreatReceivablesModel;
use Common\Model\SaleMGoodsModel;
use Common\Model\SaleWarehouseModel;
use Common\Model\SCostPriceRecordModel;
use Common\Model\SkuMGoodsModel;
use Common\Model\SLossReportGoodsModel;
use Common\Model\SLossReportOrderModel;
use Common\Model\SPurchaseRetreatOrderModel;
use Common\Model\SRetreatGoodsModel;
use Common\Model\SRetreatReceivablesModel;
use Common\Model\SSaleWarehouseModel;
use Common\Model\SStockGoodsSerialModel;
use Common\Model\SStockOutGoodsModel;
use Common\Model\SStockOutOrderModel;
use Common\Model\StockOutGoodsModel;
use Common\Model\StockOutOrderModel;
use Common\Model\SWarehousingGoodsModel;
use Common\Model\SWarehousingRecordModel;
use Common\Model\WarehousingGoodsModel;
use Common\Model\WarehousingRecordModel;
use Think\Controller;
use Common\Model\PurchaseGoodsModel;
use Common\Model\PurchaseOrderModel;
use Common\Model\PurchasePayableModel;
use Common\Model\SPurchaseOrderModel;
use Common\Model\SPurchasePayableModel;
use Common\Model\RetailGoodsModel;
use Common\Model\RetailMgoodsModel;
use Common\Model\RetailSkuGoodsModel;
use Common\Model\SPurchaseGoodsModel;
use Common\Model\SSaleMGoodsModel;
use Common\Business\GoodsClassify;
//[1.9.2]
/**
* 进销存部分公共方法
* Class InventoryController
* @package Api\Controller
* [
* 获取操作人名称 OperatorName
* 获取商户与门店的门店列表与供货商列表 storeList
* 获取所有一级分类 GoodsClass
* 获取规格属性以及具体属性信息 getSkuAttr
* 商户与门店添加规格属性 addSkuAttr_forAddMGoods
* 商户与门店添加规格名称 addSkuList_forAddMGoods
* 门店商品档案库存表新增接口 addSaleGoods
* 编辑门店商品的库存表初始化入库信息修改 SalesWarehouse
* 门店商品库存表增加减少 Inventory
* 门店获取单品的数量或者某一商品的总数量 goods_num
* 门店售后订单普通订单预售订单商品换货库存增加处理 CustomerStockInc
* 门店售后订单普通订单预售订单商品换货库存减少处理 CustomerStockDec
* 门店商品入库记录添加操作 goodsNumRise
* 门店商品出库记录添加操作 goodsNumReduce
* 门店仓库的商品可操作数量减少 WarehouseReduce
* 门店盘点 Inventorying_V1
*
* ]
*/
class InventoryController extends Controller
{
/**
* 操作人员信息
* @param $loginInfo
* @return bool
*/
public function Operator($loginInfo)
{
if (!$loginInfo) {
return false;
}
return $loginInfo;
}
/**
* 读取后台操作人姓名
* @param $id 操作人id
* @return mixed
*/
public function OperatorName($id)
{
$where = array();
$where['id'] = $id;
$info = D('JurisdictionUser')->getFind($where);
return $info['name'];
}
/**
* 门店列表
* @param $merchant_id
* @param $store_id
* @return array
*/
public function storeList($merchant_id, $store_id)
{
$where = array(
'merchantid' => $merchant_id,
'state' => 0,
'supplier_type' => 1
);
if (!empty($store_id)) {
$where['id'] = array('neq', $store_id);
}
$store = D('Store')->getSelect($where, "id,storetag");
if (!empty($store_id)) {
$map = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'status' => 1
);
$storeSupplier = M('retail_store_supplier')->field("id,supplier_name")->where($map)->order('id desc')->select();
} else {
$map = array(
'merchantid' => $merchant_id,
'status' => 1
);
$supplier = M('retail_supplier')->field("id,supplier_name")->where($map)->order('id desc')->select();
}
$res = array(
'status' => 1,
'storeList' => $store,
'supplier' => $supplier ? $supplier : array(),
'storeSupplier' => $storeSupplier ? $storeSupplier : array()
);
return $res;
}
/**
* 获取一级分类
* @param $merchant_id
* @return mixed
*/
public function GoodsClass($merchant_id)
{
$class_name = M('retail_goods_class')->where(array('merchantid' => $merchant_id, 'status' => 0, 'type' => 1))->order('code asc')->select();
return $class_name;
}
/**
* 获取商品的规格属性信息
* @param $merchant_id
* @return mixed
*/
public function getSkuAttr($merchant_id)
{
if (!$merchant_id) {
$res['status'] = 0;
$res['msg'] = '参数缺失';
return $res;
}
$skuList = M('retail_sku_attr')
->where(array('merchantid' => $merchant_id, 'status' => 1, 'state' => 0))
->field('id,name')
->select();
foreach ($skuList as &$val) {
$list = M('retail_sku_list')
->where(array('attr_id' => $val['id'], 'status' => 1, 'state' => 0))
->field('id,name')
->select();
foreach ($list as &$v) {
$v['checked'] = false;
}
$val['list'] = $list;
$val['checked'] = false;
}
$res['status'] = 1;
$res['data'] = $skuList;
return $res;
}
/**
* 添加规格属性
* @param $name 规格属性名称
* @param $user_type 用户身份 1 商户 0门店
* @param $merchant_id
* @param $store_id
* @return mixed
*/
public function addSkuAttr_forAddMGoods($name, $user_type, $merchant_id, $store_id)
{
if (!empty($merchant_id) && !empty($name)) {
$map['merchantid'] = $merchant_id;
$map['state'] = 0;
$map['name'] = $name;
$old = M('retail_sku_attr')->where($map)->find();
if (!empty($old)) {
if ($old['status'] == 1) {
$res['status'] = 0;
$res['msg'] = '已存在同名规格';
} else {
$res['status'] = 0;
$res['msg'] = '该规格已被您禁用';
}
} else {
if ($user_type == 1) {
//商户
$add['storeid'] = 0;
} else {
$add['storeid'] = $store_id;
}
$add = $map;
$add['addtime'] = time();
$add['status'] = 1;
$id = M('retail_sku_attr')->add($add);
if ($id) {
$res['status'] = 1;
$res['msg'] = '添加成功';
$res['id'] = $id;
} else {
$res['status'] = 0;
$res['msg'] = '服务器出差了';
}
}
} else {
$res['status'] = 0;
$res['msg'] = '登录超时';
}
return $res;
}
/**
* 添加规格名称的接口
* @param $id 规格属性id
* @param $name 规格名称
* @param $user_type 1商户 0门店
* @param $merchant_id
* @param $store_id
* @return mixed
*/
public function addSkuList_forAddMGoods($id, $name, $user_type, $merchant_id, $store_id)
{
if (!empty($merchant_id) && !empty($name) || !empty($id)) {
$map['merchantid'] = $merchant_id;
$map['state'] = 0;
$map['name'] = $name;
$map['attr_id'] = $id;
$old = M('retail_sku_list')->where($map)->find();
if (!empty($old)) {
if ($old['status'] == 1) {
$res['status'] = 0;
$res['msg'] = '已存在同名规格';
} else {
$res['status'] = 0;
$res['msg'] = '该规格已被您禁用';
}
} else {
$add = $map;
$add['addtime'] = time();
if ($user_type == 1) {
//商户
$add['storeid'] = 0;
} else {
$add['storeid'] = $store_id;
}
$add['status'] = 1;
$id = M('retail_sku_list')->add($add);
if ($id) {
$res['status'] = 1;
$res['msg'] = '添加成功';
$res['id'] = $id;
} else {
$res['status'] = 0;
$res['msg'] = '服务器出差了';
}
}
} else {
$res['status'] = 0;
$res['msg'] = '登录超时';
}
return $res;
}
/*
* *************************************门店模块*****************************************
*/
/**
* 门店商品档案新增接口
* @param $goods 商品信息
* @param $type 1 新增 2 编辑
* @return mixed
*/
public function addSaleGoods($goods, $type)
{
$SSaleMGoodsModel = new SSaleMGoodsModel();
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
$goods['attribute_state'] = $goods['attribute_state'] ? $goods['attribute_state'] : 1;
$goods['pricing_method'] = $goods['pricing_method'] ? $goods['pricing_method'] : 1;
$content = [
'merchant_id' => $goods['merchant_id'],
'store_id' => $goods['store_id'],
'warehouse_id' => $goods['warehouse_id'],
'goods_class_id' => $goods['goods_class_id'],
'goods_id' => $goods['goods_id'],
'goods_name' => $goods['goods_name'],
'goods_number' => $goods['goods_number'],
'goods_code' => $goods['goods_code'],
'company' => $goods['company'],
'specifications' => $goods['specifications'],
'attribute_state' => $goods['attribute_state'],
'pricing_method' => $goods['pricing_method'],
'goods_brand_id' => $goods['goods_brand_id'],
'goods_yieldly_id' => $goods['goods_yieldly_id'],
'goods_num' => $goods['goods_num'],
'more_num' => $goods['more_num'],
'less_num' => $goods['less_num'],
'status' => $goods['status'] ? $goods['status'] : 0,
'cost_price' => $goods['purchase_price'],
'serial_number_state' => $goods['serial_number_state'] ? $goods['serial_number_state'] : 0,
'third_goods_code' => $goods['third_goods_code'] ? $goods['third_goods_code'] : ''
];
if ($type == 1) {
$content['add_time'] = $goods['add_time'] ? $goods['add_time'] : time();
}
if ($content['attribute_state'] == 2) {
$content['sku_id'] = $goods['sku_id'];
$content['sku_name'] = $goods['sku_name'];
$content['sku_id_list'] = $goods['sku_id_list'];
$content['sku_goods_number'] = $goods['sku_goods_number'];
$content['sku_code'] = $goods['sku_code'];
$content['sku_num'] = $goods['sku_num'];
}
if ($type == 2) {
$where = [
'goods_id' => $goods['goods_id'],
'status' => ['in', '0,1'],
];
if ($goods['attribute_state'] == 2) {
$where['sku_id'] = $goods['sku_id'];
}
unset($content['goods_num']);
unset($content['cost_price']);
unset($content['add_time']);
$SSaleMGoodsModel->updateData($where, $content);
} else if ($type == 1) {
$SSaleMGoodsModel->addData($content);
}
if ($type == 1) {
if ($content['goods_num'] > 0) {
//库存大于0存入销售仓库
$content['warehouse_price'] = $content['cost_price'];
$content['warehouse_num'] = $content['goods_num'];
$content['surplus_num'] = $content['goods_num'];
$content['subtotal'] = round($content['warehouse_num'] * $content['warehouse_price'], 2);
$content['remarks'] = "初始化库存";
$content['type'] = 7;
unset($content['specifications']);
unset($content['goods_brand_id']);
unset($content['goods_yieldly_id']);
unset($content['goods_num']);
unset($content['more_num']);
unset($content['less_num']);
unset($content['status']);
unset($content['cost_price']);
$res = $SWarehousingGoodsModel->addData($content);
if ($res['status'] == 0) {
$res['msg'] = "商品初始化库存添加失败";
return $res;
}
//初始成本价添加
$cost = [
'merchant_id' => $goods['merchant_id'],
'store_id' => $goods['store_id'],
'cost_price' => $goods['purchase_price'],
'goods_id' => $goods['goods_id'],
'purchase_price' => $goods['purchase_price'],
'goods_class_id' => $goods['goods_class_id'],
'attribute_state' => $goods['attribute_state'],
'pricing_method' => $goods['pricing_method'],
'add_time' => $_SERVER['REQUEST_TIME']
];
if ($cost['attribute_state'] == 2) {
$cost['sku_id'] = $goods['sku_id'];
}
$SCostPriceRecordModel = new SCostPriceRecordModel();
$res = $SCostPriceRecordModel->addData($cost);
if ($res['status'] == 0) {
$res['msg'] = '商品成本价添加失败';
return $res;
}
} else {
$res = [
'status' => 1,
'msg' => '操作成功'
];
}
} else if ($type == 2) {
$where = [
'merchant_id' => $content['merchant_id'],
'store_id' => $content['store_id'],
'goods_id' => $content['goods_id'],
'type' => 7
];
if ($content['attribute_state'] == 2) {
$where['sku_id'] = $content['sku_id'];
}
$res = $SWarehousingGoodsModel->updateData($where, $content);
}
return $res;
}
/**
* 编辑门店商品初始化入库信息
* @param $data 修改的信息
* @param $store_id 门店id
* @param $goods_id 商品id
* @param $sku_id 规格id
*/
public function SalesWarehouse($data, $store_id, $goods_id, $sku_id = null)
{
$where = array();
$where['store_id'] = $store_id;
$where['goods_id'] = $goods_id;
$where['type'] = 7;
if (!empty($sku_id)) {
$where['sku_id'] = $sku_id;
}
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
$SWarehousingGoodsModel->updateData($where, $data);
}
/**
* 门店商品库存表增加减少
* @param $type 1增加 2减少
* @param $num 操作数量
* @param $goods_id 商品id
* @param null $sku_id 规格id
* @return mixed
*/
public function Inventory($type, $num, $goods_id, $sku_id = null)
{
$where = array();
if (!empty($sku_id)) {
$where['sku_id'] = $sku_id;
}
$where['goods_id'] = $goods_id;
$where['status'] = array('in', '0,1');
$saleGoodsModel = new SSaleMGoodsModel();
if ($type == 1) {
$success = $saleGoodsModel->updateSetInc($where, "goods_num", $num);
} else if ($type == 2) {
$success = $saleGoodsModel->updateSetDec($where, "goods_num", $num);
}
return $success;
}
/**
* 门店获取商品数量
* @param $type 1商品的单库存 2商品的总库存
* @param $store_id 门店id
* @param $goods_id 商品id
* @param null $sku_id 商品规格id
* @return float|int
*/
public function goods_num($type, $store_id, $goods_id, $sku_id = null)
{
$where = array();
if (!empty($sku_id)) {
$where['sku_id'] = $sku_id;
}
$where['store_id'] = $store_id;
$where['goods_id'] = $goods_id;
$where['status'] = array('in', '0,1');
if ($type == 1) {
$goods_num = D('SSaleMGoods')->getFindField($where, "goods_num");
} else if ($type == 2) {
if (!empty($sku_id)) {
unset($where['sku_id']);
}
$goods_num = D('SSaleMGoods')->getSum($where, "goods_num");
}
$goods_num = $goods_num ? round($goods_num, 3) : 0;
return $goods_num;
}
/**
* 门店售后订单商家库存增加处理
* @param $parameter
* [
* bill_order 订单信息
* ]
* @return mixed
*/
public function CustomerStockInc($parameter)
{
$bill_order = $parameter['bill_order'];
$supplier_type = D("RetailStore")->getFindField(array('id' => $bill_order['store_id']), "supplier_type");
$order_genre = D("RetailBillOnline")->getFindField(array("bill_id" => $bill_order['id']), "order_genre");
switch ($bill_order['order_type']) {
case 2:
//退款订单
switch ($order_genre) {
//1.普通订单 2.拼团订单 3.秒杀订单 4预售订单
case 1:
$type = 12;
break;
case 2:
$type = 8;
break;
case 3:
$type = 9;
break;
case 4:
$type = 17;
break;
}
break;
case 3:
//换货订单
switch ($order_genre) {
//1.普通订单 2.拼团订单 3.秒杀订单
case 1:
$type = 16;
break;
case 2:
$type = 14;
break;
case 3:
$type = 15;
break;
case 4:
$type = 18;
break;
}
break;
}
$SellModel = new RetailSellModel();
$sell_list = $SellModel->getSelect(array('bill_id' => $bill_order['id']), "id,goods_id,price,all_money,sku_json_info,num,supplier_json,purchase_id_str,serial_number_state");
if ($sell_list) {
$SSaleMGoodsModel = new SSaleMGoodsModel();
$RetailBillOrderModel = new RetailBillOrderModel();
$RetailBillAdvanceModel = new RetailBillAdvanceModel();
$AdvanceGoodsModel = new AdvanceGoodsModel();
$AdvanceSkuGoodsModel = new AdvanceSkuGoodsModel();
$SerialClass = new SerialNumberGoods();
foreach ($sell_list as $value) {
$sell_map = array(
"goods_id" => $value["goods_id"],
);
$sku_id = 0;
if (!empty($value["sku_json_info"])) {
//规格商品
$sku = json_decode($value["sku_json_info"], true);
$sell_map['sku_id'] = $sku['id'];
$sku_id = $sku['id'];
}
switch ($order_genre) {
case 1:
$SSaleMGoodsModel->updateSetInc($sell_map, "goods_num", $value['num']);//增加库存数量
break;
case 4:
//预售
$old_bill_id = $RetailBillOrderModel->getFindField(array("order_no" => $bill_order['refund_no']), "id");
$advance_info = $RetailBillAdvanceModel->getFind(array("bill_id" => $old_bill_id));
$parameter = array(
'advance_id' => $advance_info['advance_id'],
'goods_id' => $advance_info['goods_id'],
'num' => $value['num']
);
$AdvanceGoodsModel->StockSetInc($parameter);
if (!empty($advance_info['sku_id'])) {
$parameter['sku_id'] = $advance_info['sku_id'];
$AdvanceSkuGoodsModel->StockSetInc($parameter);
}
break;
}
// 添加库存记录并且加库存
if ($supplier_type == 2) {
//寄售供货商
$supplier_arr = array(
'supplier_type' => $supplier_type,
'supplier_json' => $value['supplier_json'],
'purchase_id_str' => $value['purchase_id_str'],
);
} else {
$supplier_arr = array();
}
//串号信息
$serial_list = [];
if ($value['serial_number_state'] == 1) {
$serialResult = $SerialClass->sellSerialList([
'id' => $value['id'],
'files' => 'main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two'
]);
$serial_list = $serialResult['data']['list'];
}
$data = [
'goods_id' => $value["goods_id"],
'sku_id' => $sku_id,
'num' => $value['num'],
'price' => $value['price'],
'type' => $type,
'all_money' => $value['all_money'],
'supplier_arr' => $supplier_arr,
'serial_list' => $serial_list
];
$this->goodsNumRise($data);
}
$res['status'] = 1;
$res['msg'] = '库存增加成功';
} else {
$res['status'] = 0;
$res['msg'] = '库存增加失败';
}
return $res;
}
/**
* 门店换货订单库存减少处理
* @param $parameter
* [
* bill_order 订单信息
* ]
* @return mixed
*/
public function CustomerStockDec($parameter)
{
$bill_order = $parameter['bill_order'];
$RetailBillOnlineModel = new RetailBillOnlineModel();
$order_genre = $RetailBillOnlineModel->getFindField(array("bill_id" => $bill_order['id']), "order_genre");
switch ($bill_order['order_type']) {
case 3:
//换货订单
switch ($order_genre) {
//1.普通订单 2.拼团订单 3.秒杀订单
case 1:
$type = 12;
break;
case 2:
$type = 13;
break;
case 3:
$type = 14;
break;
case 4:
$type = 15;
break;
}
break;
}
$SellModel = new RetailSellModel();
$sellOrder = $SellModel->getSelect(array("bill_id" => $bill_order['id']), "id,goods_id,price,all_money,sku_json_info,num,supplier_json,purchase_id_str,serial_number_state");
$SSaleMGoods = new SSaleMGoodsModel();
$AdvanceGoodsModel = new AdvanceGoodsModel();
$AdvanceSkuGoodsModel = new AdvanceSkuGoodsModel();
$RetailBillOrderModel = new RetailBillOrderModel();
$RetailBillAdvanceModel = new RetailBillAdvanceModel();
$SerialClass = new SerialNumberGoods();
if ($sellOrder) {
foreach ($sellOrder as $val) {
$sell_map = array(
'goods_id' => $val["goods_id"],
);
if (!empty($val["sku_json_info"])) {
//规格商品
$sku = json_decode($val["sku_json_info"], true);
$sell_map['sku_id'] = $sku['id'];
$sku_id = $sku['id'];
} else {
$sku_id = '';
}
// 减少库存
switch ($order_genre) {
case 1:
$SSaleMGoods->updateSetDec($sell_map, "goods_num", $val['num']);
break;
case 4:
//预售
$old_bill_id = $RetailBillOrderModel->getFindField(array("order_no" => $bill_order['refund_no']), "id");
$advance_info = $RetailBillAdvanceModel->getFind(array("bill_id" => $old_bill_id));
$parameter = array(
'advance_id' => $advance_info['advance_id'],
'goods_id' => $advance_info['goods_id'],
'num' => $val['num']
);
$AdvanceGoodsModel->StockSetDec($parameter);
if (!empty($advance_info['sku_id'])) {
$parameter['sku_id'] = $advance_info['sku_id'];
$AdvanceSkuGoodsModel->StockSetDec($parameter);
}
break;
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->sellSerialList([
'id' => $val['id'],
'files' => 'main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two',
]);
$serial_list = $serialResult['data']['list'];
} else {
$serial_list = [];
}
$data = [
'goods_id' => $val["goods_id"],
'sku_id' => $sku_id,
'stock_price' => $val['price'],
'stock_num' => $val['num'],
'type' => $type,
'all_money' => $val['all_money'],
'serial_list' => $serial_list,
];
$this->goodsNumReduce($data);
unset($sell_map);
unset($sku_id);
}
$res['status'] = 1;
$res['msg'] = '操作成功';
} else {
$res['status'] = 0;
$res['msg'] = '操作失败';
}
return $res;
}
/**
* 门店商品入库记录表操作(此接口针对 type = 8-21)
* @param $param
* [
* $goods_id 商品id
* $sku_id 规格id
* $warehouse_num 入库数量
* $refund_price 退货价
* $type 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团订单退货入库 9秒杀订单退货入库 10拆分入库 11收银订单退货入库 12商城正常订单退货入库 13组合入库 14商城换货入库 15秒杀换货入库 16商城普通换货入库 17预售退货入库 18预售换货入库 19收银赠品退货入库 20商城增品退货入库 21调拨拒收入库
* $all_money 该商品入库总价
* array $supplier_arr 寄售供货商采购单信息
* serial_list 串号信息
* ]
* @return mixed
*/
public function goodsNumRise($param)
{
$goods_id = $param['goods_id'];
$sku_id = $param['sku_id'];
$warehouse_num = $param['num'];
$refund_price = $param['price'];
$type = $param['type'];
$all_money = $param['all_money'];
$supplier_arr = $param['supplier_arr'];
$serial_list = $param['serial_list'] ? $param['serial_list'] : [];
$time = $_SERVER['REQUEST_TIME'];
$where = [
'goods_id' => $goods_id
];
if (!empty($sku_id)) {
$where['sku_id'] = $sku_id;
}
$SerialClass = new SerialNumberGoods();
$SSaleMGoodsModel = new SSaleMGoodsModel();
$goodsInfo = $SSaleMGoodsModel->getFind($where);
unset($goodsInfo['id']);
if ($goodsInfo) {
$goodsInfo['warehouse_price'] = round($goodsInfo['cost_price'], 2);
$goodsInfo['warehouse_num'] = round($warehouse_num, 3);
$goodsInfo['surplus_num'] = round($warehouse_num, 3);
if ($type == 10 || $type == 13) {
$goodsInfo['subtotal'] = round($goodsInfo['warehouse_price'] * $goodsInfo['warehouse_num'], 2);
} else if (in_array($type, array(8, 9, 11, 12, 14, 17, 19, 20))) {
$goodsInfo['refund_price'] = $refund_price;
$goodsInfo['subtotal'] = $all_money;
} else {
$goodsInfo['refund_price'] = round($refund_price, 2);
$goodsInfo['subtotal'] = round($goodsInfo['refund_price'] * $goodsInfo['warehouse_num'], 2);
}
switch ($type) {
case 8:
$goodsInfo['remarks'] = "拼团退货入库";
break;
case 9:
$goodsInfo['remarks'] = "秒杀退货入库";
break;
case 10:
$goodsInfo['remarks'] = "拆分入库";
break;
case 11:
$goodsInfo['remarks'] = "收银订单退货入库";
break;
case 12:
$goodsInfo['remarks'] = "商城订单退货入库";
break;
case 13:
$goodsInfo['remarks'] = "组合入库";
break;
case 14:
$goodsInfo['remarks'] = "拼团换货入库";
break;
case 15:
$goodsInfo['remarks'] = "秒杀换货入库";
break;
case 16:
$goodsInfo['remarks'] = "普通换货入库";
break;
case 17:
$goodsInfo['remarks'] = "预售退货入库";
break;
case 18:
$goodsInfo['remarks'] = "预售换货入库";
break;
case 19:
$goodsInfo['remarks'] = "收银赠品退货入库";
break;
case 20:
$goodsInfo['remarks'] = "商城赠品退货入库";
break;
case 21:
$goodsInfo['remarks'] = "调拨拒收入库";
break;
}
$goodsInfo['type'] = $type;
$goodsInfo['add_time'] = $time;
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
if (!empty($supplier_arr) && !empty($supplier_arr['supplier_json']) && !empty($supplier_arr['purchase_id_str']) && $supplier_arr['supplier_type'] == 2) {
//寄售供货商
$SPurchasePayableModel = new SPurchasePayableModel();
$supplier_json = json_decode($supplier_arr['supplier_json'], true);
$json_num = 0;
$warehouse_id_arr = []; //入库记录id集合
foreach ($supplier_json as $val) {
$json_num += $val['num'];
$goodsInfo['warehouse_price'] = $val['warehouse_price'];
$goodsInfo['warehouse_num'] = $val['num'];
$goodsInfo['surplus_num'] = $val['num'];
$goodsInfo['supplier_id'] = $val['supplier_id'];
$goodsInfo['purchase_order_id'] = $val['purchase_order_id'];
if (in_array($type, array(8, 9, 11, 12, 14, 17))) {
$goodsInfo['subtotal'] = round($refund_price * $val['num'], 2);
} else {
$goodsInfo['subtotal'] = round($val['warehouse_price'] * $val['num'], 2);
}
$res = $SWarehousingGoodsModel->addData($goodsInfo);
//串号的外部id集合
if (!empty($serial_list)) {
for ($i = 0; $i < $val['num']; $i++) {
$warehouse_id_arr[] = $res['data'];
}
}
if (in_array($type, array(8, 9, 11, 12, 17))) {
$payable_money = round($val['warehouse_price'] * $val['num'], 2);
$SPurchasePayableModel->updateSetDec(array('purchase_order_id' => $val['purchase_order_id']), "payable_money", $payable_money);
}
}
if ($warehouse_num > $json_num) {
//出现退货数量大于寄售供货商数量
unset($goodsInfo['supplier_id']);
unset($goodsInfo['purchase_order_id']);
$goodsInfo['warehouse_price'] = round($goodsInfo['cost_price'], 2);
$goodsInfo['warehouse_num'] = round($warehouse_num - $json_num, 3);
$goodsInfo['surplus_num'] = $goodsInfo['warehouse_num'];
if (in_array($type, array(8, 9, 11, 12, 14, 17))) {
$goodsInfo['subtotal'] = round($refund_price * $val['num'], 2);
} else {
$goodsInfo['subtotal'] = round($val['warehouse_price'] * $val['num'], 2);
}
$res = $SWarehousingGoodsModel->addData($goodsInfo);
if (!empty($serial_list)) {
$warehouse_id_arr[] = $res['data'];
}
}
//串号信息
if (!empty($serial_list)) {
foreach ($warehouse_id_arr as $key => $val) {
if (!empty($serial_list[$key])) {
$SerialClass->warehouseSerial([
'user_type' => 4,
'merchant_id' => $goodsInfo['merchant_id'],
'store_id' => $goodsInfo['store_id'],
'outside_id' => $val,
'goods_id' => $goods_id,
'sku_id' => $sku_id,
'type' => $type,
'add_time' => $time,
'serial_list' => [$serial_list[$key]]
]);
}
}
}
} else {
$res = $SWarehousingGoodsModel->addData($goodsInfo);
if ($res['status'] == 0) {
$res['msg'] = "入库记录添加失败";
}
//串号信息
if (!empty($serial_list)) {
$SerialClass->warehouseSerial([
'user_type' => 4,
'merchant_id' => $goodsInfo['merchant_id'],
'store_id' => $goodsInfo['store_id'],
'outside_id' => $res['data'],
'goods_id' => $goods_id,
'sku_id' => $sku_id,
'type' => $type,
'add_time' => $time,
'serial_list' => $serial_list
]);
}
}
} else {
$res['status'] = 0;
$res['msg'] = '未找到该商品无法入商品库';
}
return $res;
}
/**
* 门店商品库存状况减少记录与库存操作 此接口针对 $type = 4-17
* @param $param
* [
* $goods_id 商品id
* $sku_id 规格id
* $stock_price 出库价
* $stock_num 出库数量
* $type 出库类型 0其他出库 1退货商户出库 2盘亏出库 3调拨出库 4拼团出库 5秒杀出库 6拆分出库 7收银销售出库 8商城销售出库 9向供货商退货出库 10.组合出库 11.预售出库 12商城普通换货出库 13拼团换货出库 14秒杀换货出库 15预售换货出库 16收银赠品出库 17商城赠品出库
* int $all_money 当前售价
* sell_id 出售记录id
* array $serial_list 串号信息
* ]
* @return array
*/
public function goodsNumReduce($param)
{
$goods_id = $param['goods_id'];
$sku_id = $param['sku_id'];
$sell_id = $param['sell_id'] ? $param['sell_id'] : 0;
$stock_price = $param['stock_price'];
$stock_num = $param['stock_num'];
$type = $param['type'];
$all_money = $param['all_money'] ? $param['all_money'] : 0;
$serial_list = $param['serial_list'] ? $param['serial_list'] : [];
$where = [
'goods_id' => $goods_id
];
if (!empty($sku_id)) {
$where['sku_id'] = $sku_id;
}
$SSaleMGoodsModel = new SSaleMGoodsModel();
$goodsInfo = $SSaleMGoodsModel->getFind($where);
unset($goodsInfo['id']);
if ($goodsInfo) {
$goodsInfo['add_time'] = time();
$goodsInfo['stock_num'] = round($stock_num, 3);
if ($type == 6 || $type == 10) {
$stock_price = $stock_price ? $stock_price : $goodsInfo['cost_price']; //没有出库价按成本价算
$goodsInfo['stock_price'] = round($stock_price, 2);
$goodsInfo['cost_price'] = round($goodsInfo['cost_price'], 2);
$goodsInfo['subtotal'] = round($goodsInfo['stock_price'] * $goodsInfo['stock_num'], 2);
} else {
$goodsInfo['cost_price'] = round($goodsInfo['cost_price'], 2);
$goodsInfo['stock_price'] = round($goodsInfo['cost_price'], 2);
$goodsInfo['sale_price'] = round($stock_price, 2);
if ($type == 7 || $type == 8 || $type == 11 || $type == 12 || $type == 15) {
$goodsInfo['subtotal'] = round($all_money, 2);
} else {
$goodsInfo['subtotal'] = round($goodsInfo['sale_price'] * $goodsInfo['stock_num'], 2);
}
}
$goodsInfo['type'] = $type;
switch ($type) {
case 4:
$goodsInfo['remarks'] = '拼团出库';
break;
case 5:
$goodsInfo['remarks'] = '秒杀出库';
break;
case 6:
$goodsInfo['remarks'] = '拆分出库';
break;
case 7:
$goodsInfo['remarks'] = '收银销售出库';
break;
case 8:
$goodsInfo['remarks'] = '商城销售出库';
break;
case 10:
$goodsInfo['remarks'] = '组合出库';
break;
case 11:
$goodsInfo['remarks'] = '预售出库';
break;
case 12:
$goodsInfo['remarks'] = '普通换货出库';
break;
case 13:
$goodsInfo['remarks'] = '拼团换货出库';
break;
case 14:
$goodsInfo['remarks'] = '秒杀换货出库';
break;
case 15:
$goodsInfo['remarks'] = '预售换货出库';
break;
case 16:
$goodsInfo['remarks'] = '收银赠品出库';
break;
case 17:
$goodsInfo['remarks'] = '商城赠品出库';
break;
}
if (!empty($sell_id)) {
$goodsInfo['stock_out_id'] = $sell_id;
}
$SStockOutGoodsModel = new SStockOutGoodsModel();
$success = $SStockOutGoodsModel->addData($goodsInfo);
if ($success['status'] == 1) {
if (!empty($serial_list)) {
$SerialClass = new SerialNumberGoods();
//串号添加记录
$SerialClass->stockSerial([
'user_type' => 4,
'merchant_id' => $goodsInfo['merchant_id'],
'store_id' => $goodsInfo['store_id'],
'outside_id' => $success['data'],
'type' => $type,
'goods_id' => $goodsInfo['goods_id'],
'sku_id' => $goodsInfo['sku_id'],
'serial_list' => $serial_list,
]);
//串号库存减少
$SerialClass->warehouseSerialDec([
'user_type' => 4,
'merchant_id' => $goodsInfo['merchant_id'],
'store_id' => $goodsInfo['store_id'],
'serial_id_arr' => $serial_list,
'type' => 2
]);
}
$ware_arr = [
'merchant_id' => $goodsInfo['merchant_id'],
'store_id' => $goodsInfo['store_id'],
'goods_id' => $goods_id,
'surplus_num' => array('gt', 0)
];
if (!empty($sku_id)) {
$ware_arr['sku_id'] = $sku_id;
}
$stock_arr = $this->WarehouseReduce($ware_arr, $stock_num); //商品库库存减少
$res = array(
'status' => 1,
'msg' => '成功',
'id' => $success['data'],
'stock_arr' => $stock_arr
);
} else {
$res = array(
'status' => 0,
'msg' => '出库记录添加失败'
);
}
} else {
$res = array(
'status' => 0,
'msg' => '未找到该商品'
);
}
return $res;
}
/**
* 门店仓库的商品可操作数量减少
* @param $where 条件
* @param $total_num 减少的数量
* @return array|bool
*/
public function WarehouseReduce($where, $total_num)
{
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
$ware_goods = $SWarehousingGoodsModel->getSelect($where, '', '', "id,surplus_num,purchase_order_id,supplier_id,warehouse_price", "id asc");
if (!empty($ware_goods)) {
$stock_arr = [];
foreach ($ware_goods as $v) {
$ware_push = [
'id' => $v['id'],
'supplier_id' => $v['supplier_id'],
'purchase_order_id' => $v['purchase_order_id'],
'warehouse_price' => $v['warehouse_price']
];
if ($v['surplus_num'] >= $total_num) {
$ware_push['num'] = $total_num;
array_push($stock_arr, $ware_push);
break;
} else {
$ware_push['num'] = $v['surplus_num'];
array_push($stock_arr, $ware_push);
$total_num = round($total_num - $v['surplus_num'], 3);
}
}
$purchase_id_str = [];
$supplier_json = [];
if (!empty($stock_arr)) {
foreach ($stock_arr as $val) {
$SWarehousingGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['num']);
if (!empty($val['purchase_order_id'])) {
if (!in_array($val['purchase_order_id'], $purchase_id_str)) {
array_push($purchase_id_str, $val['purchase_order_id']);
$supplier_json[$val['purchase_order_id']] = $val;
} else {
$supplier_json[$val['purchase_order_id']]['num'] += $val['num'];
}
}
}
}
if (!empty($purchase_id_str)) {
$purchase_str = implode(',', $purchase_id_str);
$res = array(
'purchase_id_str' => $purchase_str,
'supplier_json' => $supplier_json,
);
}
} else {
$res = false;
}
return $res;
}
/*门店盘点
* @param $merchant_id 商户id
* @param $store_id 门店id
* @param $operator_id 操作人id
* @param $user_type 1商户 2门店 3收银员
* @param $warehouse_id 盘点仓库id
* @param $remarks 备注
* @param $goodsList 盘点商品
*@param $status 盘点状态 0失败 1完成盘点 2进行中(保存到草稿箱)
*@param $inventory_order_id 原盘点单id
*/
public function Inventorying($merchant_id, $store_id, $operator_id, $user_type, $warehouse_id, $remarks, $goodsList)
{
$stime = time();
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[0-9][0-9]*$/";
if (!$goodsList || !$warehouse_id || !$merchant_id || !$store_id) {
$res['status'] = 0;
$res['msg'] = "参数错误";
$this->ajaxReturn($res);
}
foreach ($goodsList as $val) {
if (!$val['cost_price']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "成本价有误,未入库的商品严禁盘点";
$this->ajaxReturn($res);
}
if (!preg_match($reg1, $val['cost_price'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确价格";
$this->ajaxReturn($res);
}
if ($val['attribute_state'] == 1) {
if ($val['pricing_method'] == 1) {
//无称重
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
} else {
if (!preg_match($reg2, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
}
}
$data = array();
$data['merchant_id'] = $merchant_id;
$data['store_id'] = $store_id;
$data['warehouse_id'] = $warehouse_id;
$data['remarks'] = $remarks;
$data['add_time'] = $stime;
$data['operator_id'] = $operator_id;
if ($user_type == 3) { //收银员
$data['operator_type'] = 1;
}
$InventoryOrder = D('SInventoryOrder')->addData($data);
if ($InventoryOrder['status'] == 0) {
$res['status'] = 0;
$res['msg'] = "订单创建失败";
$this->ajaxReturn($res);
}
$InventoryOrderId = $InventoryOrder['data'];
$InventoryOrderNumber = "SP" . orderNumber($InventoryOrderId); //盘点单
$moneyTotal = 0;
$numtotal = 0;
$warehousing_arr = array(); //入库的商品
$stock_arr = array(); //出库的商品
foreach ($goodsList as $key => &$val) {
$content = array();
$content['merchant_id'] = $merchant_id;
$content['store_id'] = $store_id;
$content['warehouse_id'] = $warehouse_id;
$content['inventory_order_id'] = $InventoryOrderId;
$content['inventory_order_number'] = $InventoryOrderNumber;
$content['add_time'] = $stime;
$content['goods_class_id'] = $val['goods_class_id'];
$content['goods_id'] = $val['goods_id'];
$content['goods_name'] = $val['goods_name'];
$content['sku_name'] = $val['sku_name'];
$content['goods_number'] = $val['goods_number'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['goods_code'] = $val['goods_code'];
$content['company'] = $val['company'];
$content['attribute_state'] = $val['attribute_state'];
$content['pricing_method'] = $val['pricing_method'];
$content['goods_num'] = $val['goods_num'];
$content['cost_price'] = $val['cost_price'];
$content['inventory_num'] = $val['inventory_num'];
$num = round($val['inventory_num'] - $val['goods_num'], 3);
switch ($num) {
case $num > 0:
$content['type'] = 1;
break;
case $num < 0:
$content['type'] = 2;
break;
case $num = 0:
$content['type'] = 0;
break;
default:
$content['type'] = 0;
}
$content['num'] = $num;
$content['subtotal'] = round($num * $val['cost_price'], 2);
$content['remarks'] = $val['remarks'];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = D('SInventoryGoods')->addData($content);
$moneyTotal += $content['subtotal'];
$numtotal += $num;
if ($success['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '盘点失败';
$this->ajaxReturn($res);
}
if ($num > 0) { //盘盈
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['warehouse_price'] = $val['cost_price'];
$new_arr['warehouse_num'] = $num;
array_push($warehousing_arr, $new_arr);
} else if ($num < 0) { //盘亏
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']);
array_push($stock_arr, $new_arr);
}
}
if (!empty($warehousing_arr)) {
//盘盈
$type = 3; //盘盈入库
$res = $this->Warehousing($merchant_id, $store_id, $operator_id, $user_type, $supplier_id = 0, $warehouse_id, $remarks, $type, $warehousing_arr, $InventoryOrderNumber);
if ($res['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
$this->ajaxReturn($res);
}
}
if (!empty($stock_arr)) {
//盘亏
$type = 2;
$res = $this->stockOut($merchant_id, $store_id, $operator_id, $user_type, $warehouse_id, $remarks, $type, $stock_arr, $InventoryOrderNumber);
if ($res['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
$this->ajaxReturn($res);
}
}
$text['amount'] = $moneyTotal;
$text['quantity'] = $numtotal;
$text['goods_species'] = count($goodsList);
$text['status'] = 1;
$text['order_number'] = $InventoryOrderNumber;
$success = D('SInventoryOrder')->updateData(array('id' => $InventoryOrderId), $text);
if ($success['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '操作失败';
$this->ajaxReturn($res);
}
$res['status'] = 1;
$res['msg'] = '操作成功';
return $res;
}
//门店盘点最新版
public function Inventorying_V1($parameter)
{
$purchase_model = new SPurchaseGoodsModel();
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter['store_id'];
$operator_id = $parameter['operator_id'];
$user_type = $parameter['user_type'];
$remarks = $parameter['remarks'];
$goodsList = $parameter['goodsList'];
$status = $parameter['status'] ? $parameter['status'] : 1; //1提交盘点 2保存草稿箱
$inventory_order_id = $parameter['inventory_order_id'] ? $parameter['inventory_order_id'] : null;
$supplier_type = $parameter['supplier_type'] ? $parameter['supplier_type'] : 1; //寄售门店
$stime = time();
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[0-9][0-9]*$/";
if (!$goodsList || !$merchant_id || !$store_id) {
$res['status'] = 0;
$res['msg'] = "参数错误";
return $res;
}
if (count($goodsList) > 500) {
$res['status'] = 0;
$res['msg'] = "一次盘点商品上限为500种商品";
return $res;
}
$WarehouseModel = new SSaleWarehouseModel();
$warehouse_id = $WarehouseModel->basisOrderGetFindField([
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'status' => 1
], "id");
if (empty($warehouse_id)) {
$res['status'] = 0;
$res['msg'] = "请创建供给仓";
return $res;
}
foreach ($goodsList as $val) {
if (!$val['cost_price']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "成本价有误,未入库的商品严禁盘点";
return $res;
}
if (!preg_match($reg1, $val['cost_price'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确价格";
return $res;
}
if ($val['attribute_state'] == 1) {
if ($val['pricing_method'] == 1) {
//无称重
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg3, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
} else {
if (!preg_match($reg2, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg2, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg3, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
}
if ($supplier_type == 2 && $val['inventory_num'] > $val['goods_num'] && $val['purchase_order_id'] == '' && !empty($val['pur_id'])) {
//寄售门店
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请与批次号绑定";
return $res;
}
}
if (empty($inventory_order_id)) {
$data = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'add_time' => $stime,
'operator_id' => $operator_id
);
if ($user_type == 3) { //收银员
$data['operator_type'] = 1;
}
$InventoryOrder = D('SInventoryOrder')->addData($data);
if ($InventoryOrder['status'] == 0) {
$res['status'] = 0;
$res['msg'] = "订单创建失败";
return $res;
}
$InventoryOrderId = $InventoryOrder['data'];
$InventoryOrderNumber = "SP" . orderNumber($InventoryOrderId); //盘点单
} else if (!empty($inventory_order_id)) {
//草稿箱的商品盘点
$InventoryOrderNumber = D('SInventoryOrder')->getFindField(array('id' => $inventory_order_id), "order_number");
if (empty($InventoryOrderNumber)) {
$res = array(
'status' => 0,
'msg' => '未找到该盘点单号'
);
return $res;
}
$InventoryOrderId = $inventory_order_id;
}
$InventoryClass = new InventoryOperation();
if (C('IS_SET_REDIS')) {
$orderStateResult = $InventoryClass->testLock([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
if ($orderStateResult['status'] != 1) {
$res = array(
'status' => 0,
'msg' => '该订单正在操作中,请稍后重试'
);
return $res;
}
$InventoryClass->addLock([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
$moneyTotal = 0;
$numtotal = 0;
$warehousing_arr = array(); //入库的商品
$stock_arr = array(); //出库的商品
$inventory_goods_ids = array(); //盘点的明细id
foreach ($goodsList as $key => &$val) {
$content = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'inventory_order_id' => $InventoryOrderId,
'inventory_order_number' => $InventoryOrderNumber,
'add_time' => $stime,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'goods_num' => $val['goods_num'],
'cost_price' => $val['cost_price'],
'inventory_num' => $val['inventory_num'],
'remarks' => $val['remarks'],
'purchase_order_id' => $val['purchase_order_id'] ? $val['purchase_order_id'] : 0
);
$num = round($val['inventory_num'] - $val['goods_num'], 3);
if ($num > 0) {
$content['type'] = 1;
} else if ($num < 0) {
$content['type'] = 2;
} else {
$content['type'] = 0;
}
$content['num'] = $num;
$content['subtotal'] = round($num * $val['cost_price'], 2);
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
if (!empty($inventory_order_id) && !empty($val['inventory_goods_id'])) {
array_push($inventory_goods_ids, $val['inventory_goods_id']);
$success = D('SInventoryGoods')->updateData(array('id' => $val['inventory_goods_id']), $content);
} else {
$success = D('SInventoryGoods')->addData($content);
if ($success['status'] == 1) {
array_push($inventory_goods_ids, $success['data']);
} else {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
return $success;
}
}
$moneyTotal += $content['subtotal'];
$numtotal += $num;
if ($status == 1) {
if ($num > 0) { //盘盈
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['warehouse_price'] = $val['cost_price'];
$new_arr['warehouse_num'] = $num;
if ($supplier_type == 2 && !empty($val['purchase_order_id'])) {
//寄售门店
$pur_map = array(
'store_id' => $store_id,
'goods_id' => $val['goods_id'],
'purchase_order_id' => $val['purchase_order_id']
);
if ($val['attribute_state'] == 2) {
$pur_map['sku_id'] = $val['sku_id'];
}
$pru_info = $purchase_model->getFieldInfo($pur_map, "supplier_id,purchase_price");
$new_arr['warehouse_price'] = $pru_info['purchase_price'] ? $pru_info['purchase_price'] : $val['cost_price'];
$new_arr['supplier_id'] = $pru_info['supplier_id'];
}
array_push($warehousing_arr, $new_arr);
} else if ($num < 0) { //盘亏
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['stock_price'] = $val['cost_price'];
$new_arr['output_num'] = round($val['goods_num'] - $val['inventory_num'], 3);
array_push($stock_arr, $new_arr);
}
}
}
if (!empty($warehousing_arr)) {
//盘盈
$parameter = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'operator_id' => $operator_id,
'user_type' => $user_type,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'type' => 3,
'goodsList' => $warehousing_arr,
'order_number' => $InventoryOrderNumber,
);
$res = $this->Warehousing($parameter);
if ($res['status'] == 0) {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
return $res;
}
}
if (!empty($stock_arr)) {
//盘亏
$parameter = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'operator_id' => $operator_id,
'user_type' => $user_type,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'type' => 2,
'goodsList' => $stock_arr,
'order_number' => $InventoryOrderNumber
);
$res = $this->stockOut($parameter);
if ($res['status'] == 0) {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
return $res;
}
}
if (!empty($inventory_order_id)) {
D('SInventoryGoods')->deleteData(array('inventory_order_id' => $inventory_order_id, 'id' => array('not in', $inventory_goods_ids)));
}
$text = array(
'amount' => $moneyTotal,
'quantity' => $numtotal,
'goods_species' => count($goodsList),
'status' => $status,
'order_number' => $InventoryOrderNumber
);
$success = D('SInventoryOrder')->updateData(array('id' => $InventoryOrderId), $text);
if ($success['status'] == 0) {
if (!empty($inventory_order_id)) {
$res['status'] = 0;
$res['msg'] = '暂无修改';
} else {
$res['status'] = 0;
$res['msg'] = '操作失败';
}
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
return $res;
}
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $InventoryOrderId
]);
}
$res['status'] = 1;
$res['msg'] = '操作成功';
return $res;
}
/**
* 门店入库操作(此接口针对 type 0 1 2 3)
* @param $parameter
* [
* user_type 4门店 6收银员
* merchant_id 商户id
* store_id 门店id
* operator_id 操作人id
* supplier_id 供货商id
* warehouse_id 入库仓库id
* remarks 入库单备注
* type 入库的商品来源 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6门店申请调拨入库
* goodsList 入库商品信息
* order_number 订单号
* stock 采购库是否减少 1减少 其他不减少
* ]
* @return mixed
* [
* status
* msg
* ]
*/
public function Warehousing($parameter)
{
if (empty($parameter['warehouse_id'])) {
$warehouseResult = new Warehouse();
$warehouseResult = $warehouseResult->getSaleWarehouseId([
'user_type' => 4,
'merchant_id' => $parameter['merchant_id'],
'store_id' => $parameter['store_id']
]);
if ($warehouseResult['status'] != 1) {
$warehouseResult['msg'] = $warehouseResult['message'];
return $warehouseResult;
}
$warehouse_id = $warehouseResult['data'];
} else {
$warehouse_id = $parameter['warehouse_id'];
}
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter['store_id'];
$operator_id = $parameter['operator_id'];
$user_type = $parameter['user_type'];
$supplier_id = $parameter['supplier_id'];
$remarks = $parameter['remarks'];
$type = $parameter['type'];
$order_number = $parameter['order_number'] ? $parameter['order_number'] : '';
$time = $_SERVER['REQUEST_TIME'];
if (empty($store_id) || !isset($type)) {
return ['status' => 0, 'msg' => '入库参数错误'];
}
$result = $this->storeWarehousingGoodsVerify($parameter);
if ($result['status'] == 0) {
return $result;
}
$goodsList = $parameter['goodsList'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'type' => $type,
'add_time' => $time,
'allocation_time' => $time,
'operator_id' => $operator_id
];
//收银员
if ($user_type == 6) {
$data['operator_type'] = 1;
}
try {
M()->startTrans();
$SWarehousingRecordModel = new SWarehousingRecordModel();
$warehouseOrder = $SWarehousingRecordModel->addData($data);
if ($warehouseOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$warehouseOrderId = $warehouseOrder['data'];
if (!empty($order_number)) {
$warehouseOrderNumber = $order_number;
} else {
$warehouseOrderNumber = 'SR' . orderNumber($warehouseOrderId);
}
$parameter['warehouseOrderNumber'] = $warehouseOrderNumber;
$parameter['warehouseOrderId'] = $warehouseOrderId;
$result = $this->storeWarehousingGoodsOperation($parameter);
if ($result['status'] != 1) {
M()->rollback();
return $result;
}
$text = array(
'money_total' => $result['data']['moneyTotal'],
'goods_species' => count($goodsList),
'real_money_total' => $result['data']['moneyTotal'],
'real_goods_species' => count($goodsList),
'status' => 1,
'order_number' => $warehouseOrderNumber
);
$success = $SWarehousingRecordModel->updateData(array('id' => $warehouseOrderId), $text);
if ($success['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店入库操作商品验证
* @param $parameter
* @return array
*/
public function storeWarehousingGoodsVerify(&$parameter)
{
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (is_array($parameter['goodsList'])) {
$goodsList = $parameter['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($parameter['goodsList']), true);
}
if (empty($goodsList)) {
return ['status' => 0, 'msg' => '请选择入库的商品'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期'];
}
if (empty($val['warehouse_price']) || !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['serial_number_state'] == 1) {
$serialResult = $SerialClass->serialVerify([
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']];
}
if ($val['warehouse_num'] != count($val['serial_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '入库数量有误'];
}
}
}
$parameter['goodsList'] = $goodsList;
return ['status' => 1, 'msg' => '验证成功'];
}
/**
* 门店商品存入入库记录表操作
* @param $parameter
* [
* goodsList 商品信息
* warehouseOrderId 入库单id
* merchant_id 商户id
* store_id 门店id
* warehouse_id 仓库id
* supplier_id 供货商id
* warehouseOrderId 入库单id
* warehouseOrderNumber 入库单号
* purchase_order_id 采购单id
* stock 1减少采购库存
* type 入库的商品来源 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团退货入库 9秒杀退货入库 10拆分入库 11收银退货入库 12商城退货入库 13组合入库 14拼团换货入库
* 15秒杀换货入库 16商城普通换货入库 17预售退货入库 18预售换货入库 19收银赠品退货入库 20商城赠品退货入库 21门店调拨拒收入库
* ]
* @return array
* [
* status
* msg
* data=>[
* moneyTotal 入库总金额
* lose 入库失败的商品信息
* cost 成本价添加失败的商品信息
* ]
* ]
*/
public function storeWarehousingGoodsOperation($parameter)
{
$storeSaleWarehouseModel = new SSaleWarehouseModel();
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
$SPurchaseGoods = new SPurchaseGoodsModel();
$SerialClass = new SerialNumberGoods();
$goodsList = $parameter['goodsList'];
$warehouseOrderId = $parameter['warehouseOrderId'] ? $parameter['warehouseOrderId'] : 0;
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter['store_id'];
if (empty($parameter['warehouse_id'])) {
$warehouse_info = $storeSaleWarehouseModel->getFind(array('store_id' => $store_id, 'status' => 1)); //仓库id
$warehouse_id = $warehouse_info['id'];
} else {
$warehouse_id = $parameter['warehouse_id']; //仓库id
}
$supplier_id = $parameter['supplier_id'] ? $parameter['supplier_id'] : '';
$warehouseOrderNumber = $parameter['warehouseOrderNumber'] ? $parameter['warehouseOrderNumber'] : '';
$type = $parameter['type'];
$purchase_order_id = $parameter['purchase_order_id'] ? $parameter['purchase_order_id'] : 0;
$time = $_SERVER['REQUEST_TIME'];
$stock = $parameter['stock'] ? $parameter['stock'] : '';
$moneyTotal = 0;
foreach ($goodsList as $val) {
$content = [
'warehouse_record_id' => $warehouseOrderId,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id ? $supplier_id : ($val['supplier_id'] ? $val['supplier_id'] : 0),
'warehouse_order_number' => $warehouseOrderNumber,
'type' => $type,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'warehouse_price' => $val['warehouse_price'],
'warehouse_num' => $val['warehouse_num'],
'surplus_num' => $val['warehouse_num'],
'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'] * 1, 2),
'remarks' => $val['remarks'],
'purchase_order_number' => $val['order_number'],
'purchase_warehouse_id' => $val['warehouse_id'],
'purchase_order_id' => $purchase_order_id ? $purchase_order_id : ($val['purchase_order_id'] ? $val['purchase_order_id'] : 0),
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $SWarehousingGoodsModel->addData($content);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '入库失败'];
}
//入库串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->warehouseSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'type' => $type,
'add_time' => $time,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
return callBack(statusCode()['error'], '串号记录添加失败');
}
}
$moneyTotal += $content['subtotal'];
$map = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'goods_id' => $content['goods_id']
];
if ($content['attribute_state'] == 2) {
$map['sku_id'] = $content['sku_id'];
}
$success = $this->goodsStockOperation($map, $content);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '成本价计算失败'];
}
if ($stock == 1) {
//采购入库
$tap = [
'id' => $val['id'],
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $val['warehouse_id'],
'goods_id' => $val['goods_id'],
];
if ($content['attribute_state'] == 2) {
$tap['sku_id'] = $content['sku_id'];
}
$SPurchaseGoods->updateSetDec($tap, "surplus_num", $content['warehouse_num']);
$SPurchaseGoods->updateSetInc($tap, "warehousing_num", $content['warehouse_num']);
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->warehousePurchaseSerial([
'user_type' => 4,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => '采购商品串号信息修改失败'];
}
}
}
}
return ['status' => 1, 'msg' => '操作成功', 'data' => ['moneyTotal' => $moneyTotal]];
}
/**
* 门店入库操作(此接口针对 type 4,5,6)
* @param $parameter
* [
* id 入库单id
* order_number 入库订单号
* goodsList 入库商品
* refuseList 拒收的商品
* warehouse_id 仓库id
* textarea 备注
* type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团退货入库 9秒杀退货入库 10拆分入库 11收银退货入库 12商城退货入库
* ]
*
* @return array|mixed
* [
* status
* msg
* data=>[
* accept_goods_species 入库的商品种数
* accept_money_total 入库的总金额
* accept_total_cost_money 入库的总成本价
* refuse_total_cost_money 拒收的总成本价
* refuse_total_stock_money 拒收的总出库价
* refuse_goods_species 拒收的总商品种数
* ]
*
* ]
*/
public function allocationWarehousing($parameter)
{
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter['store_id'];
$id = $parameter['id'];
$type = $parameter['type'];
$order_number = $parameter['order_number'];
if (is_array($parameter['goodsList'])) {
$goodsList = $parameter['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($parameter['goodsList']), true);
}
$refuseList = [];
if (!empty($parameter['refuseList'])) {
if (is_array($parameter['refuseList'])) {
$refuseList = $parameter['refuseList'];
} else {
$refuseList = json_decode(htmlspecialchars_decode($parameter['refuseList']), true);
}
}
$warehouse_id = $parameter['warehouse_id'];
$remarks = $parameter['remarks'];
$operator_id = $parameter['operator_id'];
$param_state = $this->store_warehousing_verify($parameter); //验证订单可否操作
if ($param_state['status'] == 0) {
return $param_state;
}
//商品信息验证
foreach ($goodsList as $value) {
if ($value['serial_number_state'] == 1) {
if (count($value['serial_list']) != $value['warehouse_num']) {
return ['status' => 0, 'msg' => '串号信息与入库数量不等'];
}
$serial_list = $value['serial_list'];
foreach ($serial_list as $val) {
if (empty($val['main_serial_number'])) {
return ['status' => 0, 'msg' => '有缺少主串号'];
}
}
}
}
try {
M()->startTrans();
if (!empty($refuseList)) {
$warehousingModel = new SWarehousingRecordModel();
$refuseWarehousing = new RefuseWarehousing();
$parameter['warehousing_id'] = $id;
$warehousing_info = $warehousingModel->getFind(array('id' => $id)); //入库单信息
$parameter['stock_out_id'] = $warehousing_info['stock_out_id'];
unset($parameter['goodsList']);
unset($parameter['refuseList']);
$param_state = $refuseWarehousing->paramVerify($parameter); //验证拒收参数
if ($param_state['status'] == 0) {
M()->rollback();
return $param_state;
}
foreach ($refuseList as &$va) {
$va['stock_num'] = round($va['stock_num'] - $va['warehouse_num'], 3);
$va['warehouse_price'] = $va['cost_price'];
$va['warehouse_num'] = $va['stock_num'];
//串号信息
if ($va['serial_number_state'] == 1 && count($va['serial_list']) != $va['warehouse_num']) {
M()->rollback();
return ['status' => 0, 'msg' => '拒收的串号列表有误'];
}
}
$parameter['goodsList'] = $refuseList; //拒收的商品信息
$record = $refuseWarehousing->refuseGoodsRecord($parameter); //拒收记录
if ($record['status'] != 1) {
M()->rollback();
return $record;
}
$update_refuse = [
'type' => $type,
'stock_out_id' => $parameter['stock_out_id'],
'warehousing_id' => $id,
'operator_id' => $operator_id,
'refuse_goods_species' => $record['data']['refuse_goods_species'],
'refuse_total_stock_money' => $record['data']['refuse_total_stock_money'], //拒收的出库价合计金额,
'refuse_total_cost_money' => $record['data']['refuse_total_cost_money'], //拒收成本价,
];
$refuseWarehousing->modifyOrder($update_refuse); //修改订货单
$return_goods = array(
'goodsList' => $parameter['goodsList'],
'merchant_id' => $merchant_id,
);
switch ($type) {
case 4:
$return_goods['type'] = 6; //商户调拨拒收入库
$this->MerchantWarehousingRecord($return_goods); //商户退货入库记录
break;
case 6:
$return_goods['type'] = 7; //申请调拨调拨拒收入库
$this->MerchantWarehousingRecord($return_goods); //商户退货入库记录
break;
case 5:
//其他门店调拨拒收入库
$return_goods['store_id'] = $warehousing_info['source_store_id']; //调拨的门店id
$return_goods['type'] = 21;
$this->storeWarehousingGoodsOperation($return_goods); //门店退货入库记录
break;
}
unset($parameter['stock_order_id']);
unset($parameter['warehousing_id']);
unset($parameter['goodsList']);
unset($parameter['refuseList']);
unset($warehousing_info);
}
$SaleMGoodsModel = new SSaleMGoodsModel();
$SWarehousingGoodsModel = new SWarehousingGoodsModel();
$SerialClass = new SerialNumberGoods();
$time = time();
$money_total = 0;
$total_cost_money = 0;//调拨的总成本价
//操作
foreach ($goodsList as $val) {
$store_where = [];
if ($val['attribute_state'] == 2) {
$store_where['sku_goods_number'] = $val['sku_goods_number'];
} else {
$store_where['goods_number'] = $val['goods_number'];
}
$store_where['status'] = array('in', '0,1');
$store_where['store_id'] = $store_id;
$store_where['merchant_id'] = $merchant_id;
$s_goods_info = $SaleMGoodsModel->getFind($store_where);
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'warehouse_record_id' => $id,
'type' => $type,
'goods_class_id' => $s_goods_info['goods_class_id'],
'goods_id' => $s_goods_info['goods_id'],
'sku_id' => $s_goods_info['sku_id'],
'goods_name' => $val['goods_name'],
'sku_name' => $val['sku_name'],
'sku_id_list' => $val['sku_id_list'],
'goods_number' => $s_goods_info['goods_number'],
'sku_goods_number' => $s_goods_info['sku_goods_number'],
'goods_code' => $s_goods_info['goods_code'],
'sku_code' => $s_goods_info['sku_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['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,
'add_time' => $time,
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
$res = $SWarehousingGoodsModel->addData($data); //入库记录
if ($res['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '商品入库记录保存失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->warehouseSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $res['data'],
'goods_id' => $s_goods_info['goods_id'],
'sku_id' => $s_goods_info['sku_id'] ? $s_goods_info['sku_id'] : 0,
'type' => $type,
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号保存失败'];
}
}
$money_total += $data['subtotal'];
$total_cost_money += round(($val['cost_price'] ? $val['cost_price'] : 0) * $val['warehouse_num'], 2);
$map = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'goods_id' => $s_goods_info['goods_id']
];
if ($val['attribute_state'] == 2) {
$map['sku_id'] = $s_goods_info['sku_id'];
}
$val['goods_id'] = $s_goods_info['goods_id'];
$val['goods_class_id'] = $s_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;
$this->goodsStockOperation($map, $val); //数量与成本价操作
}
//门店入库单状态修改
if (!empty($refuseList)) {
$refuse_status = 2; //存在拒收
}
$text = [
'real_goods_species' => count($goodsList),
'real_money_total' => $money_total,
'add_time' => $time,
'remarks' => $remarks,
'status' => 1,
'operator_id' => $operator_id,
'warehouse_id' => $parameter['warehouse_id'],
'refuse_status' => $refuse_status ? $refuse_status : 1
];
$SWarehousingRecordModel = new SWarehousingRecordModel();
$success = $SWarehousingRecordModel->updateData(array('id' => $id), $text);
if ($success['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '调拨单状态修改失败'];
}
if ($type == 4 || $type == 6) {
//商户调拨
$stock_out_id = $SWarehousingRecordModel->getFindField(array('id' => $id), "stock_out_id");
$real_data = [
'real_goods_species' => count($goodsList),
'real_money_total' => $money_total,
'warehousing_status' => 1,
'warehouse_time' => $time,
'real_total_cost_money' => $total_cost_money
];
$StockOutOrderModel = new StockOutOrderModel();
if ($type == 4) {
$success = $StockOutOrderModel->updateData(array('id' => $stock_out_id, 'type' => 1), $real_data);
} else if ($type == 6) {
$success = $StockOutOrderModel->updateData(array('id' => $stock_out_id, 'type' => 3), $real_data);
}
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '商户调拨单状态修改失败'];
}
} else if ($type == 5) {
//其他门店调拨
$real_data = [
'real_goods_species' => count($goodsList),
'real_money_total' => $money_total,
'warehousing_status' => 1,
'warehouse_time' => $time,
'real_total_cost_money' => $total_cost_money
];
$SStockOutOrderModel = new SStockOutOrderModel();
$success = $SStockOutOrderModel->updateData(array('warehouse_record_id' => $id, 'type' => 3), $real_data);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '门店调拨单状态修改失败'];
}
}
if (!empty($refuseList)) {
$res['refuse_status'] = 2; //存在拒收
}
M()->commit();
$res['status'] = 1;
$res['msg'] = '操作成功';
$res['accept_goods_species'] = count($goodsList);
$res['accept_money_total'] = $money_total;
$res['accept_total_cost_money'] = $total_cost_money;
$res['refuse_total_cost_money'] = $record['data']['refuse_total_cost_money'];
$res['refuse_total_stock_money'] = $record['data']['refuse_total_stock_money'];
$res['refuse_goods_species'] = $record['data']['refuse_goods_species'];
return $res;
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '入库失败'];
}
}
/**
* 验证调拨单门店入库是否可以入库
* @param $param
* @return mixed
*/
protected function store_warehousing_verify($param)
{
if (!$param['id'] || !$param['goodsList'] || !$param['warehouse_id'] || !$param['order_number'] || !$param['merchant_id'] || !$param['store_id'] || !$param['type']) {
$res['status'] = 0;
$res['msg'] = '参数缺失';
return $res;
}
if (in_array($param['type'], array(4, 5, 6))) {
switch ($param['type']) {
case 4:
case 6:
//商户调拨
$SWarehousingRecordModel = new SWarehousingRecordModel();
$res = $SWarehousingRecordModel->merchant_param_verify($param['id']);
break;
case 5:
//门店调拨
$StockOutOrderModel = new SStockOutOrderModel();
$res = $StockOutOrderModel->store_param_verify($param['id']);
break;
}
} else {
$res['status'] = 1;
$res['msg'] = '验证成功';
}
return $res;
}
//门店商品库存增加成本价重置
public function goodsStockOperation($where, $data)
{
$SSaleMGoodsModel = new SSaleMGoodsModel();
$info = $SSaleMGoodsModel->getFind($where);
if (!empty($info)) {
$SSaleMGoodsModel->updateSetInc(array('id' => $info['id']), "goods_num", $data['warehouse_num']);
if ($info['cost_price'] != $data['warehouse_price']) {//入库价与成本价不一样
$success = $this->costPrice($where);
if ($success['status'] == 1) {
$cost_price = $success['data'];
$SSaleMGoodsModel->updateData($where, array('cost_price' => $cost_price));
if (!empty($where['sku_id'])) {
M('retail_sku_goods')->where(array('id' => $where['sku_id'], 'goods_id' => $where['goods_id']))->save(array('purchase_price' => $cost_price));
} else {
D('Goods')->updateOrder(array('id' => $where['goods_id']), array('purchase_price' => $cost_price));
}
} else {
$res['status'] = 0;
$res['msg'] = '成本价计算出错';
}
} else {
$cost_price = $data['warehouse_price'];
}
if ($cost_price) {
$cost_record = array();
$cost_record['merchant_id'] = $where['merchant_id'];
$cost_record['store_id'] = $where['store_id'];
$cost_record['cost_price'] = $cost_price;
$cost_record['goods_id'] = $where['goods_id'];
if ($data['attribute_state'] == 2) {
$cost_record['sku_id'] = $where['sku_id'];
}
$cost_record['purchase_price'] = $data['warehouse_price'];
$cost_record['goods_class_id'] = $data['goods_class_id'];
$cost_record['attribute_state'] = $data['attribute_state'];
$cost_record['pricing_method'] = $data['pricing_method'];
$cost_record['add_time'] = $data['add_time'];
$SCostPriceRecordModel = new SCostPriceRecordModel();
$success = $SCostPriceRecordModel->addData($cost_record);
if ($success['status'] == 1) {
$res['status'] = 1;
$res['msg'] = '成功';
} else {
$res['status'] = 0;
$res['msg'] = '成本价记录失败';
}
}
} else {
$res['status'] = 0;
$res['msg'] = '未找到该商品';
}
return $res;
}
//门店成本价计算
public function costPrice($where)
{
$where['surplus_num'] = array('gt', 0);
$fields = "surplus_num,warehouse_price";
$order = "add_time asc";
$list = D('SWarehousingGoods')->getSelect($where, $page = '', $limit = '', $fields, $order);
if ($list) {
$priceTotal = 0;
$numTotal = 0;
foreach ($list as $val) {
$priceTotal += $val['surplus_num'] * $val['warehouse_price'];
$numTotal += $val['surplus_num'];
}
$cost_price = round(($priceTotal / $numTotal), 2);
$res['status'] = 1;
$res['data'] = $cost_price;
} else {
$res['status'] = 0;
$res['msg'] = '该商品已售完';
}
return $res;
}
/**
* 门店出库操作
* @param $param
* [
* merchant_id 商户id
* store_id 门店id
* supplier_id 供货商id
* operator_id 操作人id
* user_type 3商户 4门店 6收银员
* warehouse_id 出库仓库id
* remarks 备注
* type 0其他出库 1向商户退货出库 2盘亏出库 3调拨出库 9向供货商退货出库
* goodsList 出库商品
* transfer_id 调拨至目标门店id
* order_number 出库单号
* stock_order_id 门店调拨出库商户拒绝后重新调拨的出库单id
* ]
* 此接口针对type 0,1,2,3,9
* @return mixed
* [
* status
* msg
* ]
*/
public function stockOut($param)
{
$verifyResult = $this->stockOutVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if ($param['type'] == 4) {
foreach($param['goodsList'] as &$item) {
$item['subtotal'] = '';
$item['apply_num'] = $item['output_num'];
}
return $this->ApplyOperation($param);
}
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$supplier_id = $param['supplier_id'] ? $param['supplier_id'] : null;
$operator_id = $param['operator_id'];
$user_type = $param['user_type'];
$warehouse_id = $param['warehouse_id'];
$remarks = $param['remarks'];
$type = $param['type'];
$goodsList = $param['goodsList'];
$order_number = $param['order_number'] ? $param['order_number'] : '';
$transfer_id = $param['transfer_id'] ? $param['transfer_id'] : null;
$stock_order_id = $param['stock_order_id'] ? $param['stock_order_id'] : null;
$examine_status = $verifyResult['data']['examine_status'];
$merchant_warehouse_id = $verifyResult['data']['merchant_warehouse_id'];
$store_warehouse_id = $verifyResult['data']['store_warehouse_id'];
$time = $_SERVER['REQUEST_TIME'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'type' => $type,
'add_time' => $time,
'operator_id' => $operator_id,
'examine_status' => $examine_status ? $examine_status : 0
];
if ($type == 3) {
$data['transfer_to_store_id'] = $transfer_id;
}
if ($user_type == 6) {//收银员
$data['operator_type'] = 1;
}
if ($type == 9) {
$data['supplier_id'] = $supplier_id;
}
try {
M()->startTrans();
$StockOutOrderModel = new SStockOutOrderModel();
if (!empty($stock_order_id)) {
//修改出库单
$StockOutOrder = $StockOutOrderModel->updateData(array('id' => $stock_order_id), $data);
$StockOutOrderId = $stock_order_id;
} else {
$StockOutOrder = $StockOutOrderModel->addData($data);
$StockOutOrderId = $StockOutOrder['data'];
}
if ($StockOutOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
if (!empty($order_number)) {
$StockOutOrderNumber = $order_number;
} else {
switch ($type) {
case 0:
$order_name = "SQ";
break;
case 1:
$order_name = "SM";
break;
case 2:
$order_name = "SP";
break;
case 3:
$order_name = "SD";
break;
case 9:
$order_name = "SG";
break;
}
$StockOutOrderNumber = $order_name . orderNumber($StockOutOrderId);
}
if ($type == 1) {
//退货出库
$m_warehouse = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $merchant_warehouse_id,
'stock_out_id' => $StockOutOrderId,
'remarks' => $remarks,
'type' => 4,
'retreat_time' => $time,
];
$WarehousingRecordModel = new WarehousingRecordModel();
$m_warehouse_info = $WarehousingRecordModel->addData($m_warehouse);
if ($m_warehouse_info['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$warehouse_record_id = $m_warehouse_info['data'];
} else if ($type == 3) {
//调拨出库
$SWarehousingRecordModel = new SWarehousingRecordModel();
if (!empty($stock_order_id)) {
$SWarehousingRecordModel->updateData(array('stock_out_id' => $stock_order_id), array("examine_status" => $data['examine_status'], "allocation_time" => $time));
$warehouse_record_id = $SWarehousingRecordModel->basisOrderGetFindField(array('stock_out_id' => $stock_order_id), "id");
} else {
$s_warehouse = [
'merchant_id' => $merchant_id,
'store_id' => $transfer_id,
'source_store_id' => $store_id,
'warehouse_id' => $store_warehouse_id,
'stock_out_id' => $StockOutOrderId,
'remarks' => $remarks,
'type' => 5,
'allocation_time' => $time,
'examine_status' => $examine_status ? $examine_status : 0,
];
$s_warehouse_record_info = $SWarehousingRecordModel->addData($s_warehouse);
$warehouse_record_id = $s_warehouse_record_info['data'];
}
}
$StockOutGoodsModel = new SStockOutGoodsModel();
$SaleMGoodsModel = new SSaleMGoodsModel();
$SerialClass = new SerialNumberGoods();
$moneyTotal = 0; //出库总金额
$total_cost_price = 0; //总成本价
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'stock_out_id' => $StockOutOrderId,
'stock_order_number' => $StockOutOrderNumber,
'type' => $type,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'cost_price' => $val['cost_price'],
'stock_price' => $val['stock_price'],
'stock_num' => $val['output_num'],
'subtotal' => round($val['stock_price'] * $val['output_num'] * 1, 2),
'remarks' => $val['remarks'],
'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($type == 1 || $type == 3) {
$content['warehouse_record_id'] = $warehouse_record_id;
}
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
if ($type == 3) {
$content['examine_status'] = $data['examine_status'];
}
if ($type == 9) {
$content['supplier_id'] = $supplier_id;
}
if ($type == 3 && !empty($stock_order_id) && !empty($val['stock_id'])) {
$success = $StockOutGoodsModel->updateData(array('id' => $val['stock_id']), $content);
if ($success['status'] == 1 && $val['serial_number_state'] == 1) {
$serialResult = $SerialClass->stockSerialDelete([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $val['stock_id'],
'type' => $type,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号修改失败'];
}
}
$outside_id = $val['stock_id'];
} else {
$success = $StockOutGoodsModel->addData($content);
$outside_id = $success['data'];
}
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '出库失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->stockSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $outside_id,
'type' => $type,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号保存失败'];
}
}
$moneyTotal += $content['subtotal'];
$total_cost_price += round($content['cost_price'] * $content['stock_num'], 2);
$goods_total_num = $SaleMGoodsModel->getFindField(array('id' => $val['id']), "goods_num");
$SaleMGoodsModel->updateSetDec(array('id' => $val['id']), "goods_num", $val['output_num']);
if ($goods_total_num > 0) {
if ($type == 3 && $data['examine_status'] == 0) {
//调拨出库并且需要审核只减总库存修改串号数量
if ($val['serial_number_state'] == 1) {
$serial_id_arr = array_column($val['serial_list'], 'id');
$serialResult = $SerialClass->warehouseSerialDec([
'user_type' => 4,
'serial_id_arr' => $serial_id_arr,
'type' => 1,
'merchant_id' => $merchant_id,
'store_id' => $store_id
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
} else {
$ware_arr = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'goods_id' => $val['goods_id'],
'surplus_num' => ['gt', 0],
];
if ($val['attribute_state'] == 2) {
$ware_arr['sku_id'] = $val['sku_id'];
}
$this->WarehouseReduce($ware_arr, $val['output_num']);
//串号信息操作
if ($val['serial_number_state'] == 1) {
$serial_id_arr = array_column($val['serial_list'], 'id');
$serialResult = $SerialClass->warehouseSerialDec([
'user_type' => 4,
'serial_id_arr' => $serial_id_arr,
'type' => 1,
'merchant_id' => $merchant_id,
'store_id' => $store_id
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
if ($type == 9) {
//退货出库完重新计算成本价
$cost_map = array();
$cost_map['merchant_id'] = $merchant_id;
$cost_map['store_id'] = $store_id;
$cost_map['warehouse_id'] = $warehouse_id;
$cost_map['goods_id'] = $content['goods_id'];
if ($content['attribute_state'] == 2) {
$cost_map['sku_id'] = $content['sku_id'];
}
$success = $this->costPrice($cost_map);
if ($success['status'] == 1) {
$cost_price = round($success['data'], 2);
if ($cost_price > 0) {
D('SSaleMGoods')->updateData($cost_map, array('cost_price' => $cost_price));
if (!empty($cost_map['sku_id'])) {
M('retail_sku_goods')->where(array('id' => $cost_map['sku_id'], 'goods_id' => $cost_map['goods_id']))->save(array('purchase_price' => $cost_price));
} else {
D('Goods')->updateOrder(array('id' => $cost_map['goods_id']), array('purchase_price' => $cost_price));
}
$cost_content = array(
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'cost_price' => $cost_price,
'goods_id' => $content['goods_id'],
'sku_id' => $content['sku_id'] ? $content['sku_id'] : 0,
'purchase_price' => $content['stock_price'],
'goods_class_id' => $content['goods_class_id'],
'attribute_state' => $content['attribute_state'],
'pricing_method' => $content['pricing_method'],
'add_time' => $content['add_time'],
'type' => 2
);
D("SCostPriceRecord")->addData($cost_content);
}
}
}
}
}
}
$text = array(
'money_total' => $moneyTotal,
'total_cost_price' => $total_cost_price,
'goods_species' => count($goodsList),
'status' => 1,
'order_number' => $StockOutOrderNumber
);
if ($type == 1 || $type == 3) {
$text['warehouse_record_id'] = $warehouse_record_id;
}
$StockOutOrderModel->updateData(array('id' => $StockOutOrderId), $text);
unset($text['status']);
unset($text['warehouse_record_id']);
switch ($type) {
case 1:
$WarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text);
break;
case 3:
$SWarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text);
break;
case 9:
//向供货商退货
$capital_arr = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'supplier_id' => $supplier_id,
'retreat_order_id' => $StockOutOrderId,
'retreat_order_number' => $StockOutOrderNumber,
'operator_id' => $operator_id,
'retreat_time' => $time,
'collect_money' => $moneyTotal,
'type' => 2
];
$SRetreatReceivablesModel = new SRetreatReceivablesModel();
$result = $SRetreatReceivablesModel->addData($capital_arr);
if ($result['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '退货资金信息保存失败'];
}
break;
}
if ($type != 2) {
switch ($type) {
case 0:
$inventory_type = 7;
break;
case 1:
$inventory_type = 8;
break;
case 3:
$inventory_type = 9;
break;
case 9:
$inventory_type = 10;
break;
}
$text['operator_id'] = $operator_id;
$text['add_time'] = $time;
$print_parameter = array(
'id' => $StockOutOrderId,
'order_info' => $text,
'identity' => 2,
'type' => $inventory_type,
'store_id' => $store_id
);
A('PayApi/Printer')->inventoryPrint($print_parameter);
}
M()->commit();
$res['status'] = 1;
$res['msg'] = '成功';
return $res;
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店出库操作的参数验证
* @param $param
* [
* merchant_id 商户id
* store_id 门店id
* supplier_id 供货商id
* operator_id 操作人id
* user_type 1商户 2门店 3收银员
* warehouse_id 出库仓库id
* remarks 备注
* type 0其他出库 1向商户退货出库 2盘亏出库 3调拨出库 9向供货商退货出库
* goodsList 出库商品
* transfer_id 调拨至目标门店id
* order_number 出库单号
* stock_order_id 门店调拨出库商户拒绝后重新调拨的出库单id
* ]
* @return array
*/
public function stockOutVerify(&$param)
{
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (empty($param['merchant_id'])) {
return ['status' => 0, 'msg' => '缺少商户唯一标识'];
}
if (empty($param['store_id'])) {
return ['status' => 0, 'msg' => '缺少门店唯一标识'];
}
if (empty($param['warehouse_id'])) {
$SaleWarehouseModel = new SSaleWarehouseModel();
$warehouse_id = $SaleWarehouseModel->getFindField(array('store_id' => $param['store_id'], 'status' => 1), "id");
if (empty($warehouse_id)) {
return ['status' => 0, 'msg' => '请先创建供给仓'];
}
$param['warehouse_id'] = $warehouse_id;
}
if (is_array($param['goodsList'])) {
$goodsList = $param['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
}
if (empty($goodsList)) {
return ['status' => 0, 'msg' => '请选择商品'];
}
if (!isset($param['type']) || empty($param['operator_id'])) {
return ['status' => 0, 'msg' => '缺少操作者唯一标识'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单此操作上限为500种商品'];
}
switch ($param['type']) {
case 1:
$SaleWarehouseModel = new SaleWarehouseModel();
$merchant_warehouse = $SaleWarehouseModel->getFind(array('merchant_id' => $param['merchant_id']));
if (empty($merchant_warehouse)) {
return ['status' => 0, 'msg' => '商户未创建供给仓'];
}
$merchant_warehouse_id = $merchant_warehouse['id'];
break;
case 3:
if (empty($param['transfer_id'])) {
return ['status' => 0, 'msg' => '缺少目标门店唯一标识'];
}
$SaleWarehouseModel = new SSaleWarehouseModel();
$store_warehouse = $SaleWarehouseModel->getFind(array('merchant_id' => $param['merchant_id'], 'store_id' => $param['transfer_id'], 'status' => 1));
if (empty($store_warehouse)) {
return ['status' => 0, 'msg' => '该门店未创建供给仓'];
}
$store_warehouse_id = $store_warehouse['id'];
$store_allocation = M("retail_store_jurisdiction")->where(array("storeid" => $param['store_id']))->getField("store_allocation");
if ($store_allocation == 2) {//不需要审核
$transefer_allocation = M('retail_store_jurisdiction')->where(array('storeid' => $param['transfer_id']))->getField("store_allocation");
if ($transefer_allocation == 2) {
$examine_status = 1;
}
}
break;
case 9:
//退货供货商出库
if (empty($param['supplier_id'])) {
return ['status' => 0, 'msg' => '请选择供货商'];
}
break;
}
foreach ($goodsList as $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确的保质期'];
}
if (empty($val['stock_price']) || !preg_match($reg1, $val['stock_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['output_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['output_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['output_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['output_num'] * 1 > $val['goods_num'] * 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于辅助数量'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list']) || count($val['serial_list']) != $val['output_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
}
$param['goodsList'] = $goodsList;
return ['status' => 1, 'msg' => '验证成功', 'data' => ['examine_status' => $examine_status ? $examine_status : '', 'merchant_warehouse_id' => $merchant_warehouse_id, 'store_warehouse_id' => $store_warehouse_id]];
}
/*
*门店入库商品验证 (用于门店处理调拨进来的商品验证)
*@param $merchant_id 商户id
*@param $store_id 门店id
*@param $goodsList 入库的商品信息
*/
public function goodsVerify($merchant_id, $store_id, $goodsList)
{
$WarehouseClass = new WarehouseOperation();
$result = $WarehouseClass->goodsListVerify($merchant_id, $store_id, $goodsList);
if ($result['status'] != 3) {
$result['msg'] = $result['message'];
}
return $result;
}
/**
* 门店商品信息同步 用于门店处理调拨进来的商品信息同步
* @param $param
* [
* operate_id
* merchant_id
* store_id
* goodsIds
* type 4商户调拨过来需要同步的商品 5其他门店调拨过来需要同步的商品
* ]
* @return mixed
*/
public function batchSync($param)
{
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$goodsIds = $param['goodsIds'];
$type = $param['type'];
$operate_id = $param['operate_id'];
$SSaleWarehouseModel = new SSaleWarehouseModel();
$warehouse_id = $SSaleWarehouseModel->getFindField(array("store_id" => $store_id, "status" => 1), "id"); //供给仓id
if (!$warehouse_id) {
$res['status'] = 0;
$res['msg'] = '请先创建门店供给仓';
return $res;
}
switch ($type) {
case 4:
//商户调拨过来需要同步的商品
$GoodsModel = new MGoodsModel();
break;
case 5:
//其他门店调拨过来需要同步的商品
$GoodsModel = new RetailGoodsModel();
break;
default:
$res['status'] = 0;
$res['msg'] = "参数错误,请刷新重试";
return $res;
}
$goodsList = $GoodsModel->getSelect(array('id' => array('in', $goodsIds)));
if (empty($goodsList)) {
$res['status'] = 0;
$res['msg'] = "未找到商品信息,请确认对方是否已清空商品信息";
return $res;
}
$time = $_SERVER['REQUEST_TIME'];
$error_journal = array();
$editRecord = [];
$edit_arr = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'add_time' => $time
];
$company_arr = []; //单位集合
$relation_arr = []; //门店与商户或者其他门店的商品关联信息
$add_id_arr = []; //新增商品的商户或其他门店商品id集合
foreach ($goodsList as $val) {
if (!empty($val['company']) && !in_array($val['company'], $company_arr)) {
$company_arr[] = $val['company'];
}
$goodsInfo = $val;
if ($type == 4) {
$goodsInfo['online_state'] = $val['issellonline'] ? $val['issellonline'] : 0;
}
$goodsInfo['purchase_price'] = 0;
$goodsInfo['goods_num'] = 0;
$goodsInfo['status'] = 0;
$goodsInfo['merchant_id'] = $merchant_id;
$goodsInfo['store_id'] = $store_id;
$goodsInfo['vip_online_price'] = $val['vip_online_price'] ? $val['vip_online_price'] : 0;
$goodsInfo['vip_retail_price'] = $val['vip_retail_price'] ? $val['vip_retail_price'] : 0;
$goodsInfo['more_num'] = $val['more_num'] ? $val['more_num'] : 0;
$goodsInfo['less_num'] = $val['less_num'] ? $val['less_num'] : 0;
$goodsInfo['sync_state'] = 1;
$goodsInfo['add_time'] = $time;
switch ($type) {
case 4:
//商户调拨过来需要同步的商品
$goodsInfo['goods_number'] = $val['good_number'];
$goodsInfo['pricing_method'] = $val['can_exchange_weigh'] ? $val['can_exchange_weigh'] : 1;
$goodsInfo['attribute_state'] = $val['attribute'] ? $val['attribute'] : 1;
$goodsInfo['source_type'] = 2;
$goodsInfo['m_goods_id'] = $val['id'];
$goodsInfo['goods_img_id'] = $val['goods_image_id'] ? $val['goods_image_id'] : 0;
break;
case 5:
//其他门店调拨过来需要同步的商品
$goodsInfo['source_type'] = $val['source_type'] == 2 ? $val['source_type'] : 1;
$goodsInfo['goods_img_id'] = $val['goods_img_id'] ? $val['goods_img_id'] : 0;
}
unset($goodsInfo['id']);
$existGoodsId = ""; //已经存在的商品id
$sku_goods_number = ""; //规格商品已经存在的规格货号
if ($goodsInfo['attribute_state'] == 2) {
$existGoodsId = D('RetailGoods')->getFindField(array('store_id' => $store_id, 'status' => array('in', '0,1'), 'goods_number' => $goodsInfo['goods_number']), "id");
} else if ($goodsInfo['attribute_state'] == 1) {
$store_goods_id = D('RetailGoods')->getFindField(array('store_id' => $store_id, 'status' => array('in', '0,1'), 'goods_number' => $goodsInfo['goods_number']), "id");
if (!empty($store_goods_id)) {
$arr = array('goods_name' => $val['goods_name'], 'error' => '已经存在该商品');
array_push($error_journal, $arr);
unset($arr);
continue;
}
}
if (!empty($existGoodsId)) {
$sku_goods_number = D("RetailSkuGoods")->getFindField(array('goods_id' => $existGoodsId, 'state' => 0), "sku_goods_number", true);
} else {
$add = D('RetailGoods')->addOrder($goodsInfo);
if (!$add) {
$arr = array('goods_name' => $val['goods_name'], 'error' => '同步失败');
array_push($error_journal, $arr);
unset($arr);
continue;
}
$relation_arr[$val['id']] = $add;
$add_id_arr[] = $val['id'];
}
$s_goods_id = $existGoodsId ? $existGoodsId : $add;
$saleGoods = $goodsInfo;
$saleGoods['merchant_id'] = $merchant_id;
$saleGoods['warehouse_id'] = $warehouse_id;
$saleGoods['goods_id'] = $s_goods_id;
if ($goodsInfo['attribute_state'] == 1) {
$this->addSaleGoods($saleGoods, 1); //供给仓 1增加
} else if ($goodsInfo['attribute_state'] == 2) { // 同步规格
$add_sku = $this->addSku($val['id'], $s_goods_id, $store_id, $saleGoods, $type, $sku_goods_number);
if ($add_sku['status'] == 0) {
$arr = array('goods_name' => $val['goods_name'], 'error' => $add_sku['msg']);
array_push($error_journal, $arr);
unset($arr);
}
}
$m_goods_id = $val['id'];
// 规格同步,终止不会结束当前商品同步
$add_banner = $this->addBanner($s_goods_id, $store_id, $m_goods_id, $type); // 轮播图同步,终止不会结束当前商品同步
// 同步轮播图
if ($add_banner['status'] == 0) {
$arr = array('goods_name' => $val['goods_name'] . '5', 'error' => $add_banner['msg']);
array_push($error_journal, $arr);
unset($arr);
}
$edit_arr['goods_id'] = $s_goods_id;
$editRecord[] = $edit_arr;
unset($add);
}
//单位库
if (!empty($company_arr)) {
$UnitClass = new UnitLibrary();
$companyResult = $UnitClass->addUnit([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'company_arr' => json_encode($company_arr)
]);
if ($companyResult['status'] != 1) {
$arr = array('error' => '单位库添加失败');
array_push($error_journal, $arr);
}
}
//标签处理
if (!empty($relation_arr)) {
$LabelClass = new LabelInventory();
$labelResult = $LabelClass->basisGoodsIdGetLabelList([
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'goods_id_arr' => json_encode($add_id_arr),
'user_type' => $type == 4 ? 3 : 4
]);
if ($labelResult['status'] == 1 && !empty($labelResult['data'])) {
$labelResult = $LabelClass->addLabel([
'user_type' => 4,
'operate_id' => $operate_id,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'label_arr' => json_encode($labelResult['data']),
'relation_arr' => json_encode($relation_arr)
]);
if ($labelResult['status'] != 1) {
$arr = array('error' => '标签关联失败');
array_push($error_journal, $arr);
}
}
}
if (!empty($editRecord)) {
//商品信息更新记录
$GoodsClass = new Goods();
$GoodsClass->goodsEditRecord([
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'goods_id' => $editRecord
]);
}
if (!$error_journal) {
$res['status'] = 1;
$res['msg'] = '同步成功';
} else {
$res['status'] = 2;
$res['error_journal'] = $error_journal;
}
return $res;
}
/**
* 门店同步轮播图
* @param [int] $goods_id 门店商品id
* @param [int] $storeid 门店id
* @param [int] $mgoods_id 商户商品id
* @return [array] $res
*/
public function addBanner($goods_id, $store_id, $m_goods_id, $type)
{
switch ($type) {
case 4:
$banner = M('retail_mgoods_banner')->where(array('mgoods_id' => $m_goods_id))->select();
break;
case 5:
$banner = M('retail_goods_banner')->where(array('goods_id' => $m_goods_id))->select();
break;
}
if (!$banner) {
$res['status'] = 2;
$res['msg'] = '暂无轮播图';
return $res;
}
foreach ($banner as &$val) {
switch ($type) {
case 4:
$mgoods_banner_id = $val['id'];
break;
case 5:
if (!empty($val['mgoods_banner_id'])) {
$mgoods_banner_id = $val['mgoods_banner_id'];
} else {
$mgoods_banner_id = 0;
}
break;
}
unset($val['id']);
unset($val['mgoods_id']);
$cr = $val;
$cr['goods_id'] = $goods_id;
$cr['storeid'] = $store_id;
$cr['mgoods_banner_id'] = $mgoods_banner_id;
$add = M('retail_goods_banner')->add($cr);
if (!$add) {
$res['status'] = 0;
$res['msg'] = '同步失败';
return $res;
break;
}
}
$res['status'] = 1;
$res['msg'] = '同步成功';
return $res;
}
/**
* 门店同步规格商品
* @param $m_goods_id 来源的商品id(商户或者其他门店的商品id)
* @param [int] $goods_id 商品id
* @param [int] $storeid 门店id
* @param $saleGoods 供给仓要添加的商品信息
* @param $type 4商户调拨过来 5其他门店调拨过来
* @param $sku_goods_number 已经存在的规格货号
* @return [array] $res
*/
public function addSku($m_goods_id, $goods_id, $store_id, $saleGoods, $type, $sku_goods_number)
{
$sku_wap = array();
switch ($type) {
case 4:
$sku_wap['mgoods_id'] = $m_goods_id;
$sku_wap['state'] = 0;
if (!empty($sku_goods_number)) {
$sku_wap['sku_goods_number'] = array('not in', $sku_goods_number);
}
$skuList = M('retail_sku_mgoods')->where($sku_wap)->order("id asc")->select();
break;
case 5:
$sku_wap['goods_id'] = $m_goods_id;
$sku_wap['state'] = 0;
if (!empty($sku_goods_number)) {
$sku_wap['sku_goods_number'] = array('not in', $sku_goods_number);
}
$skuList = M('retail_sku_goods')->where($sku_wap)->order("id asc")->select();
break;
}
if (empty($skuList)) {
$res['status'] = 0;
$res['msg'] = '商品规格信息已清空';
return $res;
}
foreach ($skuList as &$val) {
switch ($type) {
case 4:
$sku_mgoods_id = $val['id'];
break;
case 5:
$sku_mgoods_id = $val['sku_mgoods_id'] ? $val['sku_mgoods_id'] : 0;
break;
}
unset($val['id']);
$skuInfo = $val;
$skuInfo['purchase_price'] = 0;
$skuInfo['goods_num'] = 0;
$skuInfo['goods_id'] = $goods_id;
$skuInfo['store_id'] = $store_id;
$skuInfo['sku_mgoods_id'] = $sku_mgoods_id;
$add = M('retail_sku_goods')->add($skuInfo);
if (!$add) {
$res['status'] = 0;
$res['msg'] = '规格同步失败,中断规格同步';
return $res;
break;
}
$sku_name = M('retail_sku_list')->where(array('id' => array('in', $val['sku_id_list'])))->field("name")->select();
$sku_name = array_column($sku_name, "name");
$sku_name = implode(',', $sku_name);
$saleGoods['purchase_price'] = $skuInfo['purchase_price'];
$saleGoods['goods_num'] = $skuInfo['goods_num'];
$saleGoods['sku_name'] = $sku_name;
$saleGoods['goods_id'] = $skuInfo['goods_id'];
$saleGoods['sku_id'] = $add;
$saleGoods['sku_id_list'] = $skuInfo['sku_id_list'];
$saleGoods['sku_goods_number'] = $skuInfo['sku_goods_number'];
$saleGoods['sku_code'] = $skuInfo['sku_code'];
$saleGoods['sku_num'] = $skuInfo['sku_num'];
$saleGoods['more_num'] = $skuInfo['more_num'];
$saleGoods['less_num'] = $skuInfo['less_num'];
$saleGoods['cost_price'] = $skuInfo['purchase_price'];
$this->addSaleGoods($saleGoods, 1); //供给仓 1增加
unset($skuInfo);
}
$res['status'] = 1;
$res['msg'] = '规格同步成功';
return $res;
}
//门店供货商信息
public function StoreSupplierInfo($supplier_id)
{
$supplierInfo = D("SSupplier")->getFieldInfo(array("id" => $supplier_id), 'advance_money,bank_card,bank_name');
$res = array(
'status' => 1,
'msg' => "查询成功",
'advanceMoney' => $supplierInfo['advance_money'],
'bank_card' => $supplierInfo['bank_card'],
'bank_name' => $supplierInfo['bank_name'],
);
return $res;
}
/*门店付款操作
*@param $payable_id 应付款id
*@param $pay_type 付款方式 1预付款方式 2微信3支付宝 4线下 5银行卡
* @param $advance_money 应付款
* @param $pay_money 付款金额
* @param $remarks 备注
* @param $add_time 付款时间
* @param $bank_card 银行卡号
* @param $bank_name 银行名称
* @param $purchase_order_number 采购订单号
* @param supplier_id 供货商id
*/
public function StorePayment($data, $merchant_id, $store_id, $operator_id)
{
$SCapitalModel = D("SPurchaseCapital");
$SPayableModel = D("SPurchasePayable");
$SSupplierModel = D("SSupplier");
$payable_id = $data['payable_id'];
$pay_type = $data['pay_type'];
$advance_money = $data['advance_money'];
$pay_money = $data['pay_money'];
$remarks = $data['remarks'];
$pay_time = $data['add_time'];
$bank_card = $data['bank_card'];
$bank_name = $data['bank_name'];
$purchase_order_number = $data['purchase_order_number'];
$supplier_id = $data['supplier_id'];
if (!$pay_type || !$pay_money || !$pay_time || !$purchase_order_number || !$supplier_id || !$payable_id) {
$res = array(
'status' => 0,
'msg' => '参数缺失'
);
return $res;
}
if ($pay_type == 1 && (!$advance_money || $advance_money < $pay_money)) {
$res = array(
'status' => 0,
'msg' => '预付款金额有误'
);
return $res;
}
if ($pay_type == 5 && (!$bank_card || !$bank_name)) {
$res = array(
'status' => 0,
'msg' => '银行卡信息或开户银行有误'
);
return $res;
}
$payableInfo = $SPayableModel->getFind(array($SPayableModel::ID => $payable_id));
if (!$payableInfo) {
$res = array(
'status' => 0,
'msg' => '未找到改采购应付款订单',
);
return $res;
}
$stay_money = round($payableInfo['payable_money'] - $payableInfo['paid_money'], 2); //待付金额
if ($stay_money <= 0) {
$res = array(
'status' => 0,
'msg' => '该采购单应付金额已全部结清,请勿重复操作',
);
return $res;
}
if ($pay_money > $stay_money) {
$res = array(
'status' => 0,
'msg' => '付款金额不能大于待付金额',
);
return $res;
}
$content = array(
$SCapitalModel::MERCHANT_ID => $merchant_id,
$SCapitalModel::STORE_ID => $store_id,
$SCapitalModel::SUPPLIER_ID => $supplier_id,
$SCapitalModel::OPERATOR_ID => $operator_id,
$SCapitalModel::PURCHASE_ORDER_NUMBER => $purchase_order_number,
$SCapitalModel::PAY_TYPE => $pay_type,
$SCapitalModel::PAY_MONEY => $pay_money,
$SCapitalModel::REMARKS => $remarks,
$SCapitalModel::PAY_TIME => strtotime($pay_time),
$SCapitalModel::ADD_TIME => time()
);
if ($pay_type == 5) {
$content[$SCapitalModel::BANK_CARD] = $bank_card;
$content['bank_name'] = $bank_name;
}
$res = $SCapitalModel->addData($content);
if ($res['status'] == 1) {
if ($pay_type == 1) {
$SSupplierModel->updateSetDec(array('id' => $supplier_id), "advance_money", $pay_money);
}
$SPayableModel->updateSetInc(array($SPayableModel::ID => $payable_id), $SPayableModel::PAID_MONEY, $pay_money);
if (round($pay_money - $stay_money, 2) == 0) {
$able[$SPayableModel::PAY_STATUS] = 3;
} else {
$able[$SPayableModel::PAY_STATUS] = 2;
}
$SPayableModel->updateData(array($SPayableModel::ID => $payable_id), $able);
$add_id = $res['data'];
$order_number = orderNumber($add_id);
$res = $SCapitalModel->updateData(array($SCapitalModel::ID => $add_id), array($SCapitalModel::ORDER_NUMBER => $order_number));
}
return $res;
}
//门店资金流水列表
public function StoreCapitalList($where, $page, $limit, $fields)
{
$SCapitalModel = D("SPurchaseCapital");
$SCapitalList = $SCapitalModel->getSelect($where, $page, $limit, $fields);
if ($SCapitalList) {
$count = $SCapitalModel->getCount($where);
foreach ($SCapitalList as $key => &$val) {
$val['index'] = $key + 1;
$val['pay_money'] = round($val['pay_money'], 2);
$val['pay_time'] = date('Y-m-d H:i:s', $val['pay_time']);
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
$val['operator_name'] = $this->OperatorName($val['operator_id']);
$val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
switch ($val[$SCapitalModel::PAY_TYPE]) {
case 1:
$val['pay_name'] = "预付款方式";
break;
case 2:
$val['pay_name'] = "微信";
break;
case 3:
$val['pay_name'] = "支付宝";
break;
case 4:
$val['pay_name'] = "线下";
break;
case 5:
$val['pay_name'] = "银行卡";
break;
}
}
}
$SCapitalList = $SCapitalList ? $SCapitalList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $SCapitalList,
'count' => $count
);
return $res;
}
//门店预付款列表
public function StoreAdvanceList($where, $page, $limit, $fields)
{
$advanceList = D("SSupplier")->getSelect($where, $page, $limit, $fields);
if ($advanceList) {
$count = D("SSupplier")->getCount($where);
foreach ($advanceList as $key => &$val) {
$val['index'] = $key + 1;
$val['advance_money'] = round($val['advance_money'], 2);
}
}
$advanceList = $advanceList ? $advanceList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'data' => $advanceList,
'count' => $count,
'msg' => "查询成功"
);
return $res;
}
/*门店预付款操作
* @param supplier_id 供货商id
* @param type 1增加 2减少
* @param money 金额
*/
public function StoreAdvanceOperation($data, $merchant_id, $store_id, $operator_id)
{
$SSupplierModel = D("SSupplier");
$SAdvanceModel = D("SAdvancePayment");
$reg = '/^[0-9]+(.[0-9]{1,2})?$/';
if (!$data['supplier_id']) {
$res = array(
'status' => 0,
'msg' => "参数缺失"
);
return $res;
}
if (empty($data['type'])) {
$res = array(
'status' => 0,
'msg' => "请选择预付款类型"
);
return $res;
}
if (empty($data['money']) || !preg_match($reg, $data['money'])) {
$res = array(
'status' => 0,
'msg' => "请输入正确金额"
);
return $res;
}
if ($data['money'] > 100000) {
$res = array(
'status' => 0,
'msg' => "金额不能超过10万元"
);
return $res;
}
$type = $data['type'];
$money = $data['money'];
$supplier_id = $data['supplier_id'];
$where['id'] = $supplier_id;
$advanceMoney = $SSupplierModel->getFindField($where, "advance_money");
switch ($type) {
case 1:
$success = $SSupplierModel->updateSetInc($where, "advance_money", $money);
break;
case 2:
if (round($advanceMoney - $money, 2) < 0) {
$res = array(
'status' => 0,
'msg' => "减少金额不能大于总余额"
);
return $res;
}
$success = $SSupplierModel->updateSetDec($where, "advance_money", $money);
break;
}
if ($success) {
$content = array(
$SAdvanceModel::MERCHANT_ID => $merchant_id,
$SAdvanceModel::STORE_ID => $store_id,
$SAdvanceModel::SUPPLIER_ID => $supplier_id,
$SAdvanceModel::OPERATOR_ID => $operator_id,
$SAdvanceModel::TYPE => $type,
$SAdvanceModel::MONEY => $money,
$SAdvanceModel::ADD_TIME => time()
);
$res = $SAdvanceModel->addData($content);
if ($res['status'] == 0) {
$res['msg'] = '暂无修改';
}
} else {
$res = array(
'status' => 0,
'msg' => '暂无改变'
);
}
return $res;
}
//门店预付款记录
public function StoreRecord($where, $page, $limit, $fields)
{
$SAdvanceModel = D("SAdvancePayment");
$recordList = $SAdvanceModel->getSelect($where, $page, $limit, $fields);
if ($recordList) {
$count = $SAdvanceModel->getCount($where);
foreach ($recordList as $key => &$val) {
$val['index'] = $key + 1;
$val['add_time'] = date("Y-m-d H:i:s", $val['add_time']);
$val['money'] = round($val['money'], 2);
if ($val['type'] == 1) {
$val['type_name'] = "增加";
} else if ($val['type'] == 2) {
$val['type_name'] = "减少";
}
$val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
$val['operator_name'] = $this->OperatorName($val['operator_id']);
}
}
$count = $count ? $count : 0;
$recordList = $recordList ? $recordList : array();
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $recordList,
'count' => $count
);
return $res;
}
//门店退货应收款列表
public function StoreReceivableList($where, $page, $limit, $fields)
{
$SRetreatReceivablesModel = D("SRetreatReceivables");
$RetreatList = $SRetreatReceivablesModel->getSelect($where, $page, $limit, $fields);
$TotalRetreatList = $SRetreatReceivablesModel->getSelect($where, $page = '', $limit = '', "*");
if ($RetreatList) {
$count = $SRetreatReceivablesModel->getCount($where);
foreach ($RetreatList as $key => &$val) {
$val['index'] = $key + 1;
$val[$SRetreatReceivablesModel::RETREAT_TIME] = date("Y-m-d H:i:s", $val[$SRetreatReceivablesModel::RETREAT_TIME]);
$val[$SRetreatReceivablesModel::COLLECT_MONEY] = round($val[$SRetreatReceivablesModel::COLLECT_MONEY], 2);
$val[$SRetreatReceivablesModel::RECEIVED_MONEY] = round($val[$SRetreatReceivablesModel::RECEIVED_MONEY], 2);
$val['stay_money'] = round($val[$SRetreatReceivablesModel::COLLECT_MONEY] - $val[$SRetreatReceivablesModel::RECEIVED_MONEY], 2);
$val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val[$SRetreatReceivablesModel::SUPPLIER_ID]), "supplier_name");
$val['operator'] = $this->OperatorName($val[$SRetreatReceivablesModel::OPERATOR_ID]);
switch ($val[$SRetreatReceivablesModel::PAY_STATUS]) {
case 1:
$val['pay_name'] = "待收款";
break;
case 2:
$val['pay_name'] = "部分收款";
break;
case 3:
$val['pay_name'] = "已收款";
break;
}
}
unset($val);
}
$collect_money = 0; //应收
$received_money = 0; //已收
$stay_money = 0; //待收
if ($TotalRetreatList) {
foreach ($TotalRetreatList as $val) {
$collect_money += $val['collect_money'];
$received_money += $val['received_money'];
}
}
$stay_money = round($collect_money - $received_money, 2);
$RetreatList = $RetreatList ? $RetreatList : array();
$count = $count ? $count : 0;
$TotalList = array(
array(
'collect_money' => $collect_money,
'received_money' => $received_money,
'stay_money' => $stay_money
)
);
$res = array(
'status' => 1,
'msg' => '查询成功',
'data' => $RetreatList,
'TotalList' => $TotalList,
'count' => $count,
);
return $res;
}
/*门店退货收款
* @param receivables_id 应收款id
* @param $pay_type 付款方式 2微信3支付宝 4线下 5银行卡
* @param $collect_money 收款金额
* @param remarks 备注
* @param add_time 收款时间
* @param bank_card 银行卡号
* @param bank_name 银行名称
* @param retreat_order_number 采购退货单号
* @param supplier_id 供货商id
*/
public function StoreCollect($data, $merchant_id, $store_id, $operator_id)
{
$SCapitalModel = D("SRetreatCapital");
$SRetreatReceivablesModel = D("SRetreatReceivables");
$receivables_id = $data['receivables_id'];
$pay_type = $data['pay_type'];
$collect_money = $data['collect_money'];
$remarks = $data['remarks'];
$collect_time = $data['add_time'];
$bank_card = $data['bank_card'];
$bank_name = $data['bank_name'];
$retreat_order_number = $data['retreat_order_number'];
$supplier_id = $data['supplier_id'];
if (!$pay_type || !$collect_money || !$collect_time || !$retreat_order_number || !$supplier_id || !$receivables_id) {
$res = array(
'status' => 0,
'msg' => '参数缺失'
);
return $res;
}
if ($pay_type == 5 && (!$bank_card || !$bank_name)) {
$res = array(
'status' => 0,
'msg' => '银行卡信息或开户银行有误'
);
return $res;
}
$receivableInfo = $SRetreatReceivablesModel->getFind(array($SRetreatReceivablesModel::ID => $receivables_id));
if (!$receivableInfo) {
$res = array(
'status' => 0,
'msg' => '未找到改退货收款订单',
);
return $res;
}
$stay_money = round($receivableInfo['collect_money'] - $receivableInfo['received_money'], 2); //待收金额
if ($stay_money <= 0) {
$res = array(
'status' => 0,
'msg' => '该退货单应付金额已全部结清,请勿重复操作',
);
return $res;
}
if ($collect_money > $stay_money) {
$res = array(
'status' => 0,
'msg' => '收款金额不能大于待收金额',
);
return $res;
}
$content = array(
$SCapitalModel::MERCHANT_ID => $merchant_id,
$SCapitalModel::STORE_ID => $store_id,
$SCapitalModel::SUPPLIER_ID => $supplier_id,
$SCapitalModel::OPERATOR_ID => $operator_id,
$SCapitalModel::RETREAT_ORDER_NUMBER => $retreat_order_number,
$SCapitalModel::PAY_TYPE => $pay_type,
$SCapitalModel::COLLECT_MONEY => $collect_money,
$SCapitalModel::REMARKS => $remarks,
$SCapitalModel::COLLECT_TIME => strtotime($collect_time),
$SCapitalModel::ADD_TIME => time()
);
if ($pay_type == 5) {
$content[$SCapitalModel::BANK_CARD] = $bank_card;
$content['bank_name'] = $bank_name;
}
$res = $SCapitalModel->addData($content);
if ($res['status'] == 1) {
$SRetreatReceivablesModel->updateSetInc(array($SRetreatReceivablesModel::ID => $receivables_id), $SRetreatReceivablesModel::RECEIVED_MONEY, $collect_money);
if (round($collect_money - $stay_money, 2) == 0) {
$able[$SRetreatReceivablesModel::PAY_STATUS] = 3;
} else {
$able[$SRetreatReceivablesModel::PAY_STATUS] = 2;
}
$SRetreatReceivablesModel->updateData(array($SRetreatReceivablesModel::ID => $receivables_id), $able);
$add_id = $res['data'];
$order_number = "SS" . orderNumber($add_id);
$res = $SCapitalModel->updateData(array($SCapitalModel::ID => $add_id), array($SCapitalModel::ORDER_NUMBER => $order_number));
}
return $res;
}
public function StoreRetreatCapitalList($where, $page, $limit, $fields)
{
$SRetreatCapitalModel = D("SRetreatCapital");
$CapitalList = $SRetreatCapitalModel->getSelect($where, $page, $limit, $fields);
if ($CapitalList) {
$count = $SRetreatCapitalModel->getCount($where);
foreach ($CapitalList as $key => &$val) {
$val['index'] = $key + 1;
$val['collect_money'] = round($val['collect_money'], 2);
$val['collect_time'] = date('Y-m-d H:i:s', $val['collect_time']);
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
$val['operator_name'] = $this->OperatorName($val['operator_id']);
$val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
switch ($val[$SRetreatCapitalModel::PAY_TYPE]) {
case 2:
$val['pay_name'] = "微信";
break;
case 3:
$val['pay_name'] = "支付宝";
break;
case 4:
$val['pay_name'] = "线下";
break;
case 5:
$val['pay_name'] = "银行卡";
break;
}
}
}
$CapitalList = $CapitalList ? $CapitalList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $CapitalList,
'count' => $count
);
return $res;
}
/**
* 门店编辑采购单
* @param $param
* [
* id 采购单id
* merchant_id
* store_id
* supplier_type 1普通供货商 2寄售供货商
* modify_price_state 修改售价权限 1关闭 2开启
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* goodsList 商品信息
* ]
* @return array
*/
public function StorePurchaseEdit($param)
{
$verifyResult = $this->purchaseOrderEditVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
$verifyResult['msg'] = $verifyResult['message'];
return $verifyResult;
}
$id = $param['id'];
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$goodsList = $param['goodsList'];
$warehouse_id = $param['warehouse_id'];
$supplier_id = $param['supplier_id'];
$remarks = $param['remarks'];
$supplier_type = $param['supplier_type'];
$time = $_SERVER['REQUEST_TIME'];
try {
$SPurchaseOrderModel = new SPurchaseOrderModel();
$purchaseOrder = $SPurchaseOrderModel->getFind(['id' => $id]);
if (empty($purchaseOrder)) {
return ['status' => 0, 'msg' => '暂无查到该订单'];
}
$money_total = 0;
$SPurchaseGoodsModel = new SPurchaseGoodsModel();
$GoodsModel = new RetailGoodsModel();
$SkuGoodsModel = new RetailSkuGoodsModel();
$SerialClass = new SerialNumberGoods();
$modify_price_state = $param['modify_price_state'];
foreach ($goodsList as $val) {
$data = [
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $val['remarks'],
'purchase_price' => $val['purchase_price'],
'purchase_num' => $val['purchase_num'],
'subtotal' => round($val['purchase_price'] * $val['purchase_num'], 2),
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'],
'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '',
];
if ($val['operated_num'] > 0) {
$data['surplus_num'] = round($val['purchase_num'] - $val['operated_num'], 3);
} else {
$data['surplus_num'] = $val['purchase_num'];
//没有操作数量可修改售价
if ($modify_price_state == 2) {
if (!empty($val['retail_price'])) {
$data['retail_price'] = $val['retail_price'];
$goods_price['retail_price'] = $val['retail_price'];
}
if (!empty($val['online_price'])) {
$data['online_price'] = $val['online_price'];
$goods_price['online_price'] = $val['online_price'];
}
}
}
$result = $SPurchaseGoodsModel->updateData(['id' => $val['id']], $data);
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->purchaseSerialUpdate([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'outside_id' => $val['id'],
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
//修改售价
if ($result['status'] == 1 && $modify_price_state == 2 && !empty($goods_price)) {
if ($val['attribute_state'] == 2) {
$SkuGoodsModel->updateOrder(['id' => $val['sku_id'], 'goods_id' => $val['goods_id']], $goods_price);
} else {
$GoodsModel->updateOrder(['id' => $val['goods_id']], $goods_price);
}
unset($goods_price);
}
$money_total += round($val['purchase_price'] * $val['purchase_num'] * 1, 2);
}
$text = [
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'money_total' => $money_total,
'remarks' => $remarks
];
$SPurchaseOrder = new SPurchaseOrderModel();
$purchaseOrder = $SPurchaseOrder->updateData(['id' => $id], $text);
//普通供货商修改资金
if ($purchaseOrder['status'] == 1 && $supplier_type != 2) {
$content = [
'supplier_id' => $supplier_id,
'payable_money' => $money_total
];
$SPurchasePayable = new SPurchasePayableModel();
$SPurchasePayable->updateData(['purchase_order_id' => $id], $content);
}
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店采购退货提交操作
* @param $param
* [
* merchant_id 商户id
* store_id 门店id
* operator_id 操作人id
* remarks 备注
* goodsList 商品信息
* warehouse_id 仓库id
* supplier_id 供货商id
* ]
* @return mixed
*/
public function StoreRetreatAction($param)
{
$verifyResult = $this->StoreRetreatActionVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$operator_id = $param['operator_id'];
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$goodsList = $param['goodsList'];
$warehouse_id = $param['warehouse_id'];
$supplier_id = $param['supplier_id'];
$remarks = $param['remarks'];
$time = $_SERVER['REQUEST_TIME'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'add_time' => $time,
'operator_id' => $operator_id
];
try {
M()->startTrans();
$SPurchaseRetreatOrderModel = new SPurchaseRetreatOrderModel();
$retreatOrder = $SPurchaseRetreatOrderModel->addData($data);
if ($retreatOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$retreatOrderId = $retreatOrder['data'];
$retreatOrderNumber = 'ST' . orderNumber($retreatOrderId);
$moneyTotal = 0; //退货总金额
$total_cost_price = 0; //原采购价
$SRetreatGoodsModel = new SRetreatGoodsModel();
$SPurchaseGoodsModel = new SPurchaseGoodsModel();
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'retreat_order_id' => $retreatOrderId,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'add_time' => $time,
'order_number' => $retreatOrderNumber,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'purchase_price' => $val['purchase_price'],
'retreat_price' => $val['retreat_price'],
'retreat_num' => $val['retreat_num_act'],
'subtotal' => round($val['retreat_price'] * $val['retreat_num_act'] * 1, 2),
'remarks' => $val['remarks'],
'purchase_order_number' => $val['order_number'],
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $SRetreatGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '采购退货失败'];
}
//串号商品
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->retreatSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号操作失败'];
}
}
$moneyTotal += $content['subtotal'];
$total_cost_price += round($content['purchase_price'] * $val['retreat_num_act'], 2);
$SPurchaseGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['retreat_num_act']);
$SPurchaseGoodsModel->updateSetInc(array('id' => $val['id']), "retreat_num", $val['retreat_num_act']);
}
$text = [
'money_total' => $moneyTotal,
'total_cost_price' => $total_cost_price,
'goods_species' => count($goodsList),
'status' => 1,
'order_number' => $retreatOrderNumber
];
$success = $SPurchaseRetreatOrderModel->updateData(array('id' => $retreatOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'supplier_id' => $supplier_id,
'retreat_order_id' => $retreatOrderId,
'retreat_order_number' => $retreatOrderNumber,
'operator_id' => $operator_id,
'retreat_time' => $time,
'collect_money' => $moneyTotal,
'type' => 1
];
$SRetreatReceivablesModel = new SRetreatReceivablesModel();
$result = $SRetreatReceivablesModel->addData($content);
if ($result['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败,退货资金添加失败'];
}
$text['operator_id'] = $operator_id;
$text['add_time'] = $time;
$print_parameter = [
'id' => $retreatOrderId,
'order_info' => $text,
'identity' => 2,
'type' => 6,
'store_id' => $store_id
];
A('PayApi/Printer')->inventoryPrint($print_parameter);
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店采购退货提交操作的参数验证
* @param $param
* [
* merchant_id 商户id
* store_id 门店id
* operator_id 操作人id
* remarks 备注
* goodsList 商品信息
* warehouse_id 仓库id
* supplier_id 供货商id
* ]
* @return mixed
*/
public function StoreRetreatActionVerify(&$param)
{
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
$warehouse_id = $param['warehouse_id'];
$supplier_id = $param['supplier_id'];
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (empty($goodsList) || empty($warehouse_id) || empty($supplier_id) || empty($merchant_id) || empty($store_id)) {
return ['status' => 0, 'msg' => '参数缺失'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
foreach ($goodsList as $val) {
if (!$val['retreat_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!$val['retreat_num_act']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
if (!preg_match($reg1, $val['retreat_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['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['retreat_num_act'] > $val['surplus_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量不能大于可退数量'];
}
//串码信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请选择串号'];
}
if (count($val['serial_list']) != $val['retreat_num_act']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量有误'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功');
}
/**
* 门店报损
* @param $param
* [
* operator_id
* merchant_id
* store_id
* goodsList
* remarks
* ]
* @return mixed
*/
public function StoreReportSub($param)
{
$verifyResult = $this->StoreReportSubVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$warehouse_id = $verifyResult['data'];
$time = $_SERVER['REQUEST_TIME'];
$goodsList = $param['goodsList'];
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'remarks' => $param['remarks'],
'add_time' => $time,
'operator_id' => $param['operator_id'],
];
try {
M()->startTrans();
$SLossReportOrderModel = new SLossReportOrderModel();
$LossOrder = $SLossReportOrderModel->addData($data);
if ($LossOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$LossOrderId = $LossOrder['data'];
$LossOrderNumber = "SB" . orderNumber($LossOrderId);
$moneyTotal = 0;
$SLossReportGoodsModel = new SLossReportGoodsModel();
$SSaleMGoodsModel = new SSaleMGoodsModel();
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'loss_order_id' => $LossOrderId,
'loss_order_number' => $LossOrderNumber,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'sku_name' => $val['sku_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'loss_price' => $val['cost_price'],
'loss_num' => $val['loss_num'],
'subtotal' => round($val['cost_price'] * $val['loss_num'] * 1, 2),
'remarks' => $val['remarks'],
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $SLossReportGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '记录保存失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->lossSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
$moneyTotal += $content['subtotal'];
$where = [
'goods_id' => $val['goods_id'],
'merchant_id' => $merchant_id,
'store_id' => $store_id,
];
if ($val['attribute_state'] == 2) {
$where['sku_id'] = $val['sku_id'];
}
$goods_total_num = $SSaleMGoodsModel->getFindField($where, "goods_num");
$SSaleMGoodsModel->updateSetDec($where, "goods_num", $val['loss_num']);
if ($goods_total_num > 0) {
$ware_arr = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'goods_id' => $val['goods_id'],
'surplus_num' => ['gt', 0],
];
if ($val['attribute_state'] == 2) {
$ware_arr['sku_id'] = $val['sku_id'];
}
$this->WarehouseReduce($ware_arr, $val['loss_num']);
//串号信息处理
if ($val['serial_number_state'] == 1) {
$serial_id_arr = array_column($val['serial_list'], 'id');
$SerialClass->warehouseSerialDec([
'user_type' => 4,
'serial_id_arr' => $serial_id_arr,
'type' => 1,
'merchant_id' => $merchant_id,
'store_id' => $store_id
]);
}
}
}
$text['money_total'] = $moneyTotal;
$text['goods_species'] = count($goodsList);
$text['status'] = 1;
$text['order_number'] = $LossOrderNumber;
$success = $SLossReportOrderModel->updateData(array('id' => $LossOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店报损提交验证
* @param $param
* [
* operator_id
* merchant_id
* store_id
* goodsList
* remarks
* ]
* @return mixed
*/
public function StoreReportSubVerify(&$param)
{
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$operator_id = $param['operator_id'];
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
if (empty($goodsList) || empty($merchant_id) || empty($store_id) || empty($operator_id)) {
return ['status' => 0, 'msg' => '参数缺失'];
}
//销售仓库
$SSaleWarehouseModel = new SSaleWarehouseModel();
$warehouse_id = $SSaleWarehouseModel->getFindField(array('merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1), "id");
if (empty($warehouse_id)) {
return ['status' => 0, 'msg' => '请先创建供给仓'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
foreach ($goodsList as $key => &$val) {
if (!$val['cost_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '成本价有误'];
}
if (!preg_match($reg1, $val['cost_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['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['loss_num'] > $val['goods_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '报损数量不能大于辅助数量'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list']) || count($val['serial_list']) != $val['loss_num']) {
return ['status' => 0, 'msg' => '请选择报损的串号信息'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功', $warehouse_id);
}
//门店报损详情 2021-1-29 已作废
public function StoreReportDetails()
{
$id = I("post.id");
$where['loss_order_id'] = $id;
$detailsList = D('SLossReportGoods')->getSelect($where, $page = '', $limit = '');
if ($detailsList) {
foreach ($detailsList as $key => &$val) {
$val['index'] = $key + 1;
$val['loss_num'] = round($val['loss_num'], 3);
$val['loss_price'] = round($val['loss_price'], 2);
$val['subtotal'] = round($val['subtotal'], 2);
$val['sku_num'] = round($val['sku_num'], 3);
if ($val['attribute_state'] == 2) {
$val['goods_code'] = $val['sku_code'];
$val['goods_number'] = $val['sku_goods_number'];
}
}
}
$res['data'] = $detailsList;
$res['status'] = 1;
return $res;
}
/**
* 获取门店采购选择的商品列表 作废时间2021-1-27
* @param $param
* [
* merchant_id
* store_id
* person1
* person2
* person3
* searchText 搜索的名称货号条码
* notInIds 排除的id
* page
* limit
* ]
* @return array
*/
public function getStoreSaleGoodsList($param)
{
$goodsClass = new GoodsClassify();
$where = $goodsClass->getGoodsClassId($param, [], 'goods_class_id'); //获取分类id
if (!empty($param['searchText'])) {
$where['goods_number|sku_goods_number|goods_code|sku_code|goods_name|sku_name'] = array('like', '%' . $param['searchText'] . '%');
}
if (!empty($param['notInIds'])) {
$where['id'] = array('not in', $param['notInIds']);
}
$where['merchant_id'] = $param['merchant_id'];
$where['store_id'] = $param['store_id'];
$where['status'] = array('in', array(0, 1));
$SaleGoodsModel = new SSaleMGoodsModel();
$list = $SaleGoodsModel->getSelect($where, $param['page'], $param['limit'], "*", "goods_num asc");
if (!empty($list)) {
$count = $SaleGoodsModel->getCount($where);
$goodsModel = new RetailGoodsModel();
$skuGoodsModel = new RetailSkuGoodsModel();
$purchaseGoodsModel = new SPurchaseGoodsModel();
foreach ($list as $key => &$value) {
$value['purchase_num'] = ""; //进货数量
$value['goods_num'] = round($value['goods_num'], 3);
if ($value['attribute_state'] == 2) {
//规格
$goods = $skuGoodsModel->getFind([
'goods_id' => $value['goods_id'],
'id' => $value['sku_id']
], 'retail_price,online_price');
} else {
//无规格
$goods = $goodsModel->getFind(array('id' => $value['goods_id']), "retail_price,online_price");
}
$value['retail_price'] = $goods['retail_price'] ? round($goods['retail_price'], 2) : ''; //线下价
$value['online_price'] = $goods['online_price'] ? round($goods['online_price'], 2) : ''; //线上价
$map = [
'goods_id' => $value['goods_id']
];
if ($value['attribute_state'] == 2) {
$map['sku_id'] = $value['sku_id'];
}
$purchase_info = $purchaseGoodsModel->getFind($map, "id desc");
if (!empty($purchase_info)) {
$value['purchase_price'] = round($purchase_info['purchase_price'], 2);
} else {
$value['purchase_price'] = round($value['cost_price'], 2);
}
}
}
return callBack(statusCode()['success'], '查询成功', [
'list' => $list ? $list : [],
'count' => $count ? $count : 0
]);
}
/**
* 门店采购提交参数验证
* @param $param
* [
* merchant_id
* store_id
* goodsList
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* type 1采购 2补采
* add_time 补采时间
* supplier_type 供货商类型 1普通供货商 2寄售供货商
* operator_id 操作人id
* modify_price_state modify_price_state
* ]
* @return array
*/
public function storePurchaseVerify(&$param)
{
$warehouse_id = $param['warehouse_id'];
$supplier_id = $param['supplier_id'];
$type = $param['type'];
if (is_array($param['goodsList'])) {
$goodsList = $param['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
}
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (empty($goodsList) || empty($warehouse_id) || empty($supplier_id) || empty($type)) {
return ['status' => 0, 'msg' => '参数错误'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期'];
}
if (!$val['purchase_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!$val['purchase_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
if (!preg_match($reg1, $val['purchase_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['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
//串号验证
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->serialVerify([
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']];
}
if ($val['purchase_num'] != count($val['serial_list'])) {
return ['status' => 0, 'msg' => '请输入正确的数量'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功');
}
/**
* 门店采购提交操作
* @param $param
* [
* merchant_id
* store_id
* goodsList
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* type 1采购 2补采
* add_time 补采时间
* supplier_type 供货商类型 1普通供货商 2寄售供货商
* operator_id 操作人id
* modify_price_state 编辑售价 1关闭 2开启
* ]
* @return array
*/
public function storePurchaseOperation($param)
{
$result = $this->storePurchaseVerify($param);
if ($result['status'] == 0) {
return $result;
}
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$goodsList = $param['goodsList'];
$supplier_id = $param['supplier_id'];
$warehouse_id = $param['warehouse_id'];
$remarks = $param['remarks'];
$type = $param['type'];
$add_time = $param['add_time'];
$supplier_type = $param['supplier_type'];
$operator_id = $param['operator_id'];
$time = $_SERVER['REQUEST_TIME'];
$modify_price_state = $param['modify_price_state'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'type' => $type,
'operator_id' => $operator_id,
'repair_time' => $time
];
if ($type == 2) {
//补采购单
$data['add_time'] = strtotime($add_time);
} else {
$data['add_time'] = $time;
}
try {
M()->startTrans();
$PurchaseOrderModel = new SPurchaseOrderModel();
$purchaseOrder = $PurchaseOrderModel->addData($data);
if ($purchaseOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$purchaseOrderId = $purchaseOrder['data'];
$purchaseOrderNumber = 'SC' . orderNumber($purchaseOrderId);
$moneyTotal = 0;
$SPurchaseGoodsModel = new SPurchaseGoodsModel();
$GoodsModel = new RetailGoodsModel();
$skuGoodsModel = new RetailSkuGoodsModel();
$SerialNumberGoodsClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'purchase_order_id' => $purchaseOrderId,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'order_number' => $purchaseOrderNumber,
'add_time' => $time,
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_class_id' => $val['goods_class_id'],
'goods_number' => $val['goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'purchase_price' => $val['purchase_price'],
'purchase_num' => $val['purchase_num'],
'surplus_num' => $val['purchase_num'],
'subtotal' => round($val['purchase_price'] * $val['purchase_num'] * 1, 2),
'remarks' => $val['remarks'],
'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'retail_price' => $val['retail_price'] ? round($val['retail_price'], 2) : null,
'online_price' => $val['online_price'] ? round($val['online_price'], 2) : null,
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0,
'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '',
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
$content['sku_name'] = $val['sku_name'];
}
$success = $SPurchaseGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '采购失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialNumberGoodsClass->purchaseSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'] ? $val['sku_id'] : 0,
'type' => 1,
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串码信息录入失败'];
}
}
$moneyTotal += $content['subtotal'];
//修改售价
if ($modify_price_state == 2 && (!empty($val['retail_price']) || !empty($val['online_price']))) {
if (!empty($val['retail_price'])) {
$goods_price['retail_price'] = $val['retail_price'];
}
if (!empty($val['online_price'])) {
$goods_price['online_price'] = $val['online_price'];
}
if ($val['attribute_state'] == 2) {
$skuGoodsModel->updateOrder(array('goods_id' => $val['goods_id'], 'id' => $val['sku_id']), $goods_price);
} else {
$GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price);
}
unset($goods_price);
}
}
$text['money_total'] = $moneyTotal;
$text['goods_species'] = count($goodsList);
$text['status'] = 1;
$text['order_number'] = $purchaseOrderNumber;
$success = $PurchaseOrderModel->updateData(array('id' => $purchaseOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
$content = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'supplier_id' => $supplier_id,
'purchase_order_id' => $purchaseOrderId,
'purchase_order_number' => $purchaseOrderNumber,
'operator_id' => $operator_id,
'purchase_time' => $time,
];
if ($supplier_type == 2) {
$content['payable_money'] = 0;
} else {
$content['payable_money'] = $moneyTotal;
}
$SPurchasePayable = new SPurchasePayableModel();
$success = $SPurchasePayable->addData($content);
if ($success['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '应付款订单生成失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功', 'data' => [
'money_total' => $text['money_total'],
'goods_species' => $text['goods_species'],
'order_number' => $text['order_number'],
'id' => $purchaseOrderId
]];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 门店采购全部入库
* @param $param
* [
* operator_id 操作人id
* merchant_id
* store_id
* id 采购单id
* ]
* @return mixed
*/
public function storePurchaseWarehouse($param)
{
$id = $param['id'];
$merchant_id = $param['merchant_id'];
$store_id = $param['store_id'];
$operator_id = $param['operator_id'];
try {
$SPurchaseOrderModel = new SPurchaseOrderModel();
$purOrderInfo = $SPurchaseOrderModel->getFind(['id' => $id]);
if (empty($purOrderInfo)) {
return ['status' => 0, 'msg' => '未找到该采购单'];
}
if ($purOrderInfo['warehouse_state'] == 1) {
return ['status' => 0, 'msg' => '该订单已入库,请刷新重试'];
}
if (C('IS_SET_REDIS')) {
$redis_key = 'retail_merchant_id_' . $merchant_id . '_store_id_' . $store_id . '_purchase_order_id_' . $id;
$CacheClass = new CacheHandle();
$state = $CacheClass->deposit($redis_key);
if ($state == 1) {
return ['status' => 0, 'msg' => '该订单正在操作中,请稍后刷新重试'];
}
$CacheClass->addRedis($redis_key, $id, 300);
}
$where = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'purchase_order_id' => $id,
'surplus_num' => ['gt', 0]
];
$SPurchaseGoodsModel = new SPurchaseGoodsModel();
$goodsList = $SPurchaseGoodsModel->getSelect($where);
if (!empty($goodsList)) {
$supplier_id = $purOrderInfo['supplier_id'];
//销售仓库
$SSaleWarehouseModel = new SSaleWarehouseModel();
$warehouse_id = $SSaleWarehouseModel->getFindField(['merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1], "id");
if (!$warehouse_id) {
return ['status' => 0, 'msg' => '请先创建供给仓'];
}
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$val['warehouse_num'] = round($val['surplus_num'], 3);
$val['warehouse_price'] = round($val['purchase_price'], 2);
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->returnableSerialList([
'user_type' => 4,
'id' => $val['id']
]);
$val['serial_list'] = $serialResult['data']['list'];
}
}
$remarks = $purOrderInfo['remarks'];
$data = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'operator_id' => $operator_id,
'supplier_id' => $supplier_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'type' => 1,
'goodsList' => $goodsList,
'stock' => 1,
'purchase_order_id' => $id
];
$success = $this->Warehousing($data);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
$SPurchaseOrderModel->updateData(array('id' => $id), array('warehouse_state' => 1));
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/*
* *******************************************商户模块*******************************************
*/
/*
* 商户供给仓库商品信息新增与编辑
* @param $goods 商品信息
* @param $type 1 新增 2编辑
*
*/
public function merAddSaleGoods($goods, $type)
{
$goods['attribute_state'] = $goods['attribute_state'] ? $goods['attribute_state'] : 1;
$goods['pricing_method'] = $goods['pricing_method'] ? $goods['pricing_method'] : 1;
$content = array(
'merchant_id' => $goods['merchant_id'],
'warehouse_id' => $goods['warehouse_id'],
'goods_class_id' => $goods['goods_class_id'],
'goods_id' => $goods['goods_id'],
'goods_name' => $goods['goods_name'],
'goods_number' => $goods['goods_number'],
'goods_code' => $goods['goods_code'],
'company' => $goods['company'],
'specifications' => $goods['specifications'],
'attribute_state' => $goods['attribute_state'],
'pricing_method' => $goods['pricing_method'],
'goods_brand_id' => $goods['goods_brand_id'],
'goods_yieldly_id' => $goods['goods_yieldly_id'],
'goods_num' => $goods['goods_num'],
'more_num' => $goods['more_num'],
'less_num' => $goods['less_num'],
'status' => $goods['status'],
'cost_price' => $goods['purchase_price']
);
if ($type == 1) {
$content['add_time'] = $goods['add_time'] ? $goods['add_time'] : time();
}
if ($content['attribute_state'] == 2) {
$content['sku_id'] = $goods['sku_id'];
$content['sku_name'] = $goods['sku_name'];
$content['sku_id_list'] = $goods['sku_id_list'];
$content['sku_goods_number'] = $goods['sku_goods_number'];
$content['sku_code'] = $goods['sku_code'];
$content['sku_num'] = $goods['sku_num'];
}
if ($type == 2) {
$where = array();
$where['goods_id'] = $goods['goods_id'];
if ($goods['attribute_state'] == 2) {
$where['sku_id'] = $goods['sku_id'];
}
unset($content['goods_num']);
unset($content['cost_price']);
unset($content['add_time']);
$res = D('SaleMGoods')->updateData($where, $content);
} else if ($type == 1) {
$res = D('SaleMGoods')->addData($content);
}
if ($type == 1) {
if ($content['goods_num'] > 0) {
//库存大于0存入销售仓库
$content['warehouse_price'] = $content['cost_price'];
$content['warehouse_num'] = $content['goods_num'];
$content['surplus_num'] = $content['goods_num'];
$content['subtotal'] = round($content['warehouse_num'] * $content['warehouse_price'], 2);
$content['remarks'] = "初始化库存";
$content['type'] = 5;
unset($content['specifications']);
unset($content['goods_brand_id']);
unset($content['goods_yieldly_id']);
unset($content['goods_num']);
unset($content['more_num']);
unset($content['less_num']);
unset($content['status']);
unset($content['cost_price']);
$res = D('WarehousingGoods')->addData($content);
if ($res['status'] == 0) {
$res['msg'] = "商品初始化库存添加失败";
$this->ajaxReturn($res);
}
//初始成本价添加
$cost = array(
'merchant_id' => $goods['merchant_id'],
'cost_price' => $goods['purchase_price'],
'goods_id' => $goods['goods_id'],
'purchase_price' => $goods['purchase_price'],
'goods_class_id' => $goods['goods_class_id'],
'attribute_state' => $goods['attribute_state'],
'pricing_method' => $goods['pricing_method'],
'add_time' => $goods['add_time'],
);
if ($cost['attribute_state'] == 2) {
$cost['sku_id'] = $goods['sku_id'];
}
$res = D('CostPriceRecord')->addData($cost);
if ($res['status'] == 0) {
$res['msg'] = '商品成本价添加失败';
$this->ajaxReturn($res);
}
}
} else if ($type == 2) {
$where = array();
$where['merchant_id'] = $content['merchant_id'];
$where['goods_id'] = $content['goods_id'];
$where['type'] = 5;
if ($content['attribute_state'] == 2) {
$where['sku_id'] = $content['sku_id'];
}
D('WarehousingGoods')->updateData($where, $content);
}
}
/**
* 获取商户采购选择的商品列表
* @param $parameter
* @return array
*/
public function getMerchantSaleGoodsList($parameter)
{
$merchant_id = $parameter['merchant_id']; //商户id
$searchText = $parameter['searchText']; //搜索的名称货号条码
$notInIds = $parameter['notInIds']; //排除的id
$page = $parameter['page'];
$limit = $parameter['limit'];
if (!empty($searchText)) {
$where['goods_number|sku_goods_number|goods_code|sku_code|goods_name|sku_name'] = array('like', '%' . $searchText . '%');
}
$goodsClass = new GoodsClassify();
$result = $goodsClass::getGoodsClassId($parameter, $where, 'goods_class_id'); //获取分类id
if ($result) {
$where = $result;
}
if (!empty($notInIds)) {
$where['id'] = array('not in', $notInIds);
}
$where['merchant_id'] = $merchant_id;
$where['status'] = array('in', array(0, 1));
$info = D('SaleMGoods')->getSelect($where, $page, $limit, $field = '', $order = "goods_num asc");
if ($info) {
$count = D('SaleMGoods')->getCount($where);
$goodsModel = new RetailMgoodsModel();
foreach ($info as $key => &$value) {
$value['purchase_num'] = ""; //进货数量
$value['goods_num'] = round($value['goods_num'], 3);
$value['build_date'] = "";
$value['quality_guarantee_period'] = "";
if ($value['attribute_state'] == 2) {
//规格
$goods = M('retail_sku_mgoods')->field("retail_price,online_price")->where(array('mgoods_id' => $value['goods_id'], 'id' => $value['sku_id']))->find();
} else {
//无规格
$goods = $goodsModel->getFind(array('id' => $value['goods_id']), "retail_price,online_price");
}
$value['retail_price'] = $goods['retail_price'] ? round($goods['retail_price'], 2) : ''; //线下价
$value['online_price'] = $goods['online_price'] ? round($goods['online_price'], 2) : ''; //线上价
//默认采购价
$map = array();
$map['goods_id'] = $value['goods_id'];
if ($value['attribute_state'] == 2) {
$map['sku_id'] = $value['sku_id'];
}
$purchase_info = D('PurchaseGoods')->getFind($map, "id desc");
if (!empty($purchase_info)) {
$value['purchase_price'] = round($purchase_info['purchase_price'], 2);
} else {
$value['purchase_price'] = round($value['cost_price'], 2);
}
}
}
return array(
'info' => $info,
'count' => $count ? $count : 0
);
}
/**
* 商户采购单验证参数
* @param $param
* [
* operator_id
* merchant_id
* supplier_id 供货商id
* warehouse_id 仓库id
* type 1常规订单 2补采
* add_time
* goodsList
* remarks
* ]
* @return array
*/
protected function merchantPurchaseOperationVerify(&$param)
{
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (empty($param['merchant_id']) || empty($goodsList) || empty($param['warehouse_id']) || empty($param['supplier_id']) || empty($param['type'])) {
return ['status' => 0, 'msg' => '参数缺失'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
$serial_arr = [];
$SerialNumberGoodsClass = new SerialNumberGoods();
foreach ($goodsList as $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match("/^[0-9]*[1-9][0-9]*$/", $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期'];
}
if (!$val['purchase_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
if (!preg_match($reg1, $val['purchase_price'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!empty($val['retail_price']) && !preg_match($reg1, $val['retail_price'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确店内零售价'];
}
if (!empty($val['online_price']) && !preg_match($reg1, $val['online_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['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['purchase_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
//串码验证
if ($val['serial_number_state'] == 1) {
if ($val['purchase_num'] != count($val['serial_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号信息数量不足'];
}
$numberResult = $SerialNumberGoodsClass->serialVerify([
'serial_list' => $val['serial_list'],
'data' => $serial_arr
]);//串码验证
if ($numberResult['status'] != 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $numberResult['message']];
}
$serial_arr = $numberResult['data'];
}
}
$param['goodsList'] = $goodsList;
return ['status' => 1, 'msg' => '验证成功'];
}
/**
* 商户采购提交
* @param $param
* [
* operator_id
* merchant_id
* modify_price_state 编辑售价 1关闭 2开启
* supplier_id 供货商id
* warehouse_id 仓库id
* type 1常规订单 2补采
* add_time
* goodsList
* remarks
* ]
* @return mixed
*/
public function merchantPurchaseOperation($param)
{
$result = $this->merchantPurchaseOperationVerify($param); //参数验证
if ($result['status'] == 0) {
return $result;
}
$merchant_id = $param['merchant_id'];
$goodsList = $param['goodsList'];
$supplier_id = $param['supplier_id'];
$warehouse_id = $param['warehouse_id'];
$remarks = $param['remarks'];
$type = $param['type'];
$add_time = $param['add_time'];
$operator_id = $param['operator_id'];
$modify_price_state = $param['modify_price_state'] ? $param['modify_price_state'] : 1; //修改售价权限默认关闭
$time = $_SERVER['REQUEST_TIME'];
$PurchaseOrderModel = new PurchaseOrderModel();
$PurchaseGoodsModel = new PurchaseGoodsModel();
$SerialNumberGoodsClass = new SerialNumberGoods();
$GoodsModel = new RetailMgoodsModel();
$SkuGoodsModel = new SkuMGoodsModel();
$data = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'type' => $type,
'repair_time' => $time,
'operator_id' => $operator_id,
];
if ($type == 2) {
//补采购单
$data['add_time'] = strtotime($add_time);
} else {
$data['add_time'] = $time;
}
//创建采购单
try {
M()->startTrans();
$purchaseOrder = $PurchaseOrderModel->addData($data);
if ($purchaseOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$purchaseOrderId = $purchaseOrder['data'];
$purchaseOrderNumber = 'MC' . orderNumber($purchaseOrderId);
$moneyTotal = 0;
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'purchase_order_id' => $purchaseOrderId,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'order_number' => $purchaseOrderNumber,
'add_time' => $time,
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_class_id' => $val['goods_class_id'],
'goods_number' => $val['goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'purchase_price' => $val['purchase_price'],
'purchase_num' => $val['purchase_num'],
'surplus_num' => $val['purchase_num'],
'subtotal' => round($val['purchase_price'] * $val['purchase_num'] * 1, 2),
'remarks' => $val['remarks'],
'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0,
'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '',
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
$content['sku_name'] = $val['sku_name'];
}
//开启修改售价
if ($modify_price_state == 2) {
$content['retail_price'] = $val['retail_price'] ? $val['retail_price'] : null;
$content['online_price'] = $val['online_price'] ? $val['online_price'] : null;
}
$success = $PurchaseGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '采购失败'];
}
//添加串码信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialNumberGoodsClass->purchaseSerial([
'user_type' => 3,
'merchant_id' => $merchant_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'] ? $val['sku_id'] : 0,
'type' => 1,
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串码信息录入失败'];
}
}
$moneyTotal += $content['subtotal'];
//修改商品价格
if ($modify_price_state == 2 && (!empty($val['retail_price']) || !empty($val['online_price']))) {
if (!empty($val['retail_price'])) {
$goods_price['retail_price'] = $val['retail_price'];
}
if (!empty($val['online_price'])) {
$goods_price['online_price'] = $val['online_price'];
}
if ($val['attribute_state'] == 2) {
$SkuGoodsModel->updateOrder([
'mgoods_id' => $val['goods_id'],
'id' => $val['sku_id']
], $goods_price);
} else {
$GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price);
}
unset($goods_price);
}
}
$moneyTotal = round($moneyTotal, 2);
$text = array(
'money_total' => $moneyTotal,
'goods_species' => count($goodsList),
'status' => 1,
'order_number' => $purchaseOrderNumber
);
$success = $PurchaseOrderModel->updateData(array('id' => $purchaseOrderId), $text);
if ($success['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
$content = [
'merchant_id' => $merchant_id,
'supplier_id' => $supplier_id,
'purchase_order_id' => $purchaseOrderId,
'purchase_order_number' => $purchaseOrderNumber,
'operator_id' => session("jurisdiction_user")['id'],
'purchase_time' => $time,
'payable_money' => $moneyTotal,
];
$PurchasePayableModel = new PurchasePayableModel();
$success = $PurchasePayableModel->addData($content);
if ($success['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '应付款生成失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 商户编辑采购单提交操作
* @param $param
* [
* id 采购单id
* merchant_id
* modify_price_state 修改售价权限 1关闭 2开启
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* goodsList 商品信息
* ]
* @return array
*/
public function purchaseOrderEdit($param)
{
$verifyResult = $this->purchaseOrderEditVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return ['status' => 0, 'msg' => $verifyResult['message']];
}
$id = $param['id'];
$merchant_id = $param['merchant_id'];
$modify_price_state = $param['modify_price_state'];
$goodsList = $param['goodsList'];
$supplier_id = $param['supplier_id'];
$warehouse_id = $param['warehouse_id'];
$remarks = $param['remarks'];
$time = $_SERVER['REQUEST_TIME'];
try {
$PurchaseOrderModel = new PurchaseOrderModel();
$purchaseOrder = $PurchaseOrderModel->getFind(['id' => $id]);
if (empty($purchaseOrder)) {
return ['status' => 0, 'msg' => '暂无查到该订单'];
}
$money_total = 0;
$PurchaseGoodsModel = new PurchaseGoodsModel();
$GoodsModel = new RetailMgoodsModel();
$SkuGoodsModel = new SkuMGoodsModel();
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$data = [
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $val['remarks'],
'purchase_price' => $val['purchase_price'],
'purchase_num' => $val['purchase_num'],
'subtotal' => round($val['purchase_price'] * $val['purchase_num'], 2),
'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '',
];
if ($val['operated_num'] > 0) {
$data['surplus_num'] = round($val['purchase_num'] - $val['operated_num'], 3);
} else {
$data['surplus_num'] = $val['purchase_num'];
//修改售价
if ($modify_price_state == 2) {
if (!empty($val['retail_price'])) {
$data['retail_price'] = $val['retail_price'];
$goods_price['retail_price'] = $val['retail_price'];
}
if (!empty($val['online_price'])) {
$data['online_price'] = $val['online_price'];
$goods_price['online_price'] = $val['online_price'];
}
}
}
$result = $PurchaseGoodsModel->updateData(array('id' => $val['id']), $data);
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->purchaseSerialUpdate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'outside_id' => $val['id'],
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
//修改售价
if ($result['status'] == 1 && $modify_price_state == 2 && !empty($goods_price)) {
if ($val['attribute_state'] == 2) {
$SkuGoodsModel->updateOrder(['mgoods_id' => $val['goods_id'], 'id' => $val['sku_id']], $goods_price);
} else {
$GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price);
}
unset($goods_price);
}
$money_total += round($val['purchase_price'] * $val['purchase_num'] * 1, 2);
}
$money_total = round($money_total, 2);
$text = array(
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'money_total' => $money_total,
'remarks' => $remarks
);
$purchaseOrder = $PurchaseOrderModel->updateData(array('id' => $id), $text);
if ($purchaseOrder['status'] == 1) {
$content = [
'supplier_id' => $supplier_id,
'payable_money' => $money_total
];
$PurchasePayableModel = new PurchasePayableModel();
$PurchasePayableModel->updateData(array('purchase_order_id' => $id), $content);
}
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 编辑采购单提交操作的参数验证
* @param $param
* [
* id 采购单id
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* goodsList 商品信息
* ]
* @return mixed
*/
public function purchaseOrderEditVerify(&$param)
{
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
if (empty($goodsList) || empty($param['id']) || empty($param['warehouse_id']) || empty($param['supplier_id'])) {
return callBack(statusCode()['error'], '请选择必要选项');
}
$SerialClass = new SerialNumberGoods();
$data = [];
foreach ($goodsList as $key => $val) {
//串号信息验证
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list'])) {
return callBack(statusCode()['error'], $val['goods_name'] . $val['sku_name'] . '请输入串号信息');
}
$serialResult = $SerialClass->serialVerify([
'serial_list' => $val['serial_list'],
'data' => $data
]);
if ($serialResult['status'] != 1) {
return $serialResult;
}
if ($val['purchase_num'] != count($val['serial_list'])) {
return callBack(statusCode()['error'], $val['goods_name'] . $val['sku_name'] . '采购数量有误');
}
$data = $serialResult['data'];
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功');
}
/**
* 商户采购入库到供给仓
* @param $param
* [
* operator_id
* merchant_id
* id 采购单id
* ]
* @return mixed
*/
public function MerPurchaseWarehouse($param)
{
$operator_id = $param['operator_id'];
$merchant_id = $param['merchant_id'];
$id = $param['id'];
try {
$PurchaseOrderModel = new PurchaseOrderModel();
$PurchaseGoodsModel = new PurchaseGoodsModel();
$purOrderInfo = $PurchaseOrderModel->getFind(array('id' => $id));
if (empty($purOrderInfo)) {
return ['status' => 0, 'msg' => '未找到该采购单'];
}
if ($purOrderInfo['warehouse_state'] == 1) {
return ['status' => 0, 'msg' => '该采购单已入库请刷新重试'];
}
//验证
if (C('IS_SET_REDIS')) {
$redis_key = 'retail_merchant_id_' . $merchant_id . '_purchase_order_id_' . $id;
$CacheClass = new CacheHandle();
$state = $CacheClass->deposit($redis_key);
if ($state == 1) {
return ['status' => 0, 'msg' => '正在操作该订单,请稍后刷新重试'];
}
$CacheClass->addRedis($redis_key, $id, 300);
}
$where['merchant_id'] = $merchant_id;
$where['purchase_order_id'] = $id;
$where['surplus_num'] = array('gt', 0);
$goodsList = $PurchaseGoodsModel->getSelect($where);
if (!empty($goodsList)) {
$supplier_id = $purOrderInfo['supplier_id'];
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$val['warehouse_num'] = round($val['surplus_num'], 3);
$val['warehouse_price'] = round($val['purchase_price'], 2);
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->returnableSerialList([
'user_type' => 3,
'id' => $val['id']
]);
$val['serial_list'] = $serialResult['data']['list'];
}
}
$remarks = $purOrderInfo['remarks'];
$data = [
'merchant_id' => $merchant_id,
'operator_id' => $operator_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'goodsList' => $goodsList,
'type' => 1,
'stock' => 1
];
$success = $this->MerWarehousing($data);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => $success['msg']];
}
}
$result = $PurchaseOrderModel->updateData(array('id' => $id), array('warehouse_state' => 1));
if ($result) {
return ['status' => 1, 'msg' => '入库成功'];
} else {
return ['status' => 0, 'msg' => '入库失败'];
}
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '入库失败'];
}
}
/**
* 商户采购退货操作
* @param $param
* [
* merchant_id
* operator_id 操作人id
* goodsList 商品信息
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* ]
* @return array|mixed
*/
public function MerRetreatAction($param)
{
$verifyResult = $this->MerRetreatActionVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$merchant_id = $param['merchant_id'];
$operator_id = $param['operator_id'];
$goodsList = $param['goodsList'];
$supplier_id = $param['supplier_id'];
$warehouse_id = $param['warehouse_id'];
$remarks = $param['remarks'];
$time = $_SERVER['REQUEST_TIME'];
$RetreatOrderModel = new PurchaseRetreatOrderModel();
$RetreatGoodsModel = new RetreatGoodsModel();
$PurchaseGoodsModel = new PurchaseGoodsModel();
$RetreatReceivablesModel = new RetreatReceivablesModel();
$SerialClass = new SerialNumberGoods();
$data = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'remarks' => $remarks,
'add_time' => $time,
'operator_id' => $operator_id
];
try {
M()->startTrans();
$retreatOrder = $RetreatOrderModel->addData($data);
if ($retreatOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$retreatOrderId = $retreatOrder['data'];
$retreatOrderNumber = 'MT' . orderNumber($retreatOrderId);
$moneyTotal = 0; //退货总价
$total_cost_price = 0; //原采购价合计
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'retreat_order_id' => $retreatOrderId,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'add_time' => $time,
'order_number' => $retreatOrderNumber,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'purchase_price' => $val['purchase_price'],
'retreat_price' => $val['retreat_price'],
'retreat_num' => $val['retreat_num_act'],
'subtotal' => round($val['retreat_price'] * $val['retreat_num_act'] * 1, 2),
'remarks' => $val['remarks'],
'purchase_order_number' => $val['order_number'],
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'],
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0,
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $RetreatGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '采购退货失败'];
}
//串号商品
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->retreatSerial([
'user_type' => 3,
'merchant_id' => $merchant_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号操作失败'];
}
}
$moneyTotal += $content['subtotal'];
$total_cost_price += round($content['purchase_price'] * $val['retreat_num_act'], 2);
$PurchaseGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['retreat_num_act']);
$PurchaseGoodsModel->updateSetInc(array('id' => $val['id']), "retreat_num", $val['retreat_num_act']);
}
$text = [
'money_total' => $moneyTotal,
'total_cost_price' => $total_cost_price,
'goods_species' => count($goodsList),
'status' => 1,
'order_number' => $retreatOrderNumber
];
$success = $RetreatOrderModel->updateData(array('id' => $retreatOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
$content = [
'merchant_id' => $merchant_id,
'supplier_id' => $supplier_id,
'retreat_order_id' => $retreatOrderId,
'retreat_order_number' => $retreatOrderNumber,
'operator_id' => $operator_id,
'retreat_time' => $time,
'collect_money' => $moneyTotal,
'type' => 1
];
$result = $RetreatReceivablesModel->addData($content);
if ($result['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 商户采购退货操作的参数验证
* @param $param
* [
* [
* merchant_id
* operator_id 操作人id
* goodsList 商品信息
* supplier_id 供货商id
* warehouse_id 仓库id
* remarks 备注
* ]
* ]
* @return mixed
*/
public function MerRetreatActionVerify(&$param)
{
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
if (empty($param['merchant_id']) || empty($goodsList) || empty($param['supplier_id']) || empty($param['warehouse_id'])) {
return ['status' => 0, 'msg' => '参数错误'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
foreach ($goodsList as $val) {
if (!$val['retreat_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!$val['retreat_num_act']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
if (!preg_match($reg1, $val['retreat_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['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['retreat_num_act'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['retreat_num_act'] > $val['surplus_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量不能大于可退数量'];
}
//串码信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请选择串号'];
}
if (count($val['serial_list']) != $val['retreat_num_act']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量有误'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功');
}
/*商户盘点
*@param $user 用户信息
* @param $merchant_id 商户id
* @param $warehouse_id 盘点仓库id
* @param $remarks 备注
* @param $goodsList 盘点商品
* @param $type 盘盈 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库
* @param $stock 采购库是否减少 1减少 其他不减少
*@param $status 盘点状态 0失败 1完成盘点 2进行中(保存到草稿箱)
*@param $inventory_order_id 盘点单id
*/
//商户盘点
public function MerInventorying($merchant_id, $operator_id, $warehouse_id, $remarks, $goodsList)
{
$stime = time();
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[0-9][0-9]*$/";
if (!$goodsList || !$warehouse_id || !$merchant_id) {
$res['status'] = 0;
$res['msg'] = "缺少参数";
$this->ajaxReturn($res);
}
foreach ($goodsList as $key => &$val) {
if (!$val['cost_price']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "成本价有误";
$this->ajaxReturn($res);
}
if (!preg_match($reg1, $val['cost_price'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确价格";
$this->ajaxReturn($res);
}
if ($val['attribute_state'] == 1) {
if ($val['pricing_method'] == 1) {
//无称重
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
} else {
if (!preg_match($reg2, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
$this->ajaxReturn($res);
}
}
}
$data = array();
$data['merchant_id'] = $merchant_id;
$data['warehouse_id'] = $warehouse_id;
$data['remarks'] = $remarks;
$data['add_time'] = $stime;
$data['operator_id'] = $operator_id;
$InventoryOrder = D('InventoryOrder')->addData($data);
if ($InventoryOrder['status'] == 0) {
$res['status'] = 0;
$res['msg'] = "订单创建失败";
$this->ajaxReturn($res);
}
$InventoryOrderId = $InventoryOrder['data'];
$InventoryOrderNumber = "MP" . orderNumber($InventoryOrderId); //盘点单
$moneyTotal = 0;
$numtotal = 0;
$warehousing_arr = array(); //入库的商品
$stock_arr = array(); //出库的商品
foreach ($goodsList as $key => &$val) {
$content = array();
$content['merchant_id'] = $merchant_id;
$content['warehouse_id'] = $warehouse_id;
$content['inventory_order_id'] = $InventoryOrderId;
$content['inventory_order_number'] = $InventoryOrderNumber;
$content['add_time'] = $stime;
$content['goods_class_id'] = $val['goods_class_id'];
$content['goods_id'] = $val['goods_id'];
$content['goods_name'] = $val['goods_name'];
$content['sku_name'] = $val['sku_name'];
$content['goods_number'] = $val['goods_number'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['goods_code'] = $val['goods_code'];
$content['company'] = $val['company'];
$content['attribute_state'] = $val['attribute_state'];
$content['pricing_method'] = $val['pricing_method'];
$content['goods_num'] = $val['goods_num'];
$content['cost_price'] = $val['cost_price'];
$content['inventory_num'] = $val['inventory_num'];
$num = round($val['inventory_num'] - $val['goods_num'], 3);
switch ($num) {
case $num > 0:
$content['type'] = 1;
break;
case $num < 0:
$content['type'] = 2;
break;
case $num = 0:
$content['type'] = 0;
break;
default:
$content['type'] = 0;
}
$content['num'] = $num;
$content['subtotal'] = round($num * $val['cost_price'], 2);
$content['remarks'] = $val['remarks'];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = D('InventoryGoods')->addData($content);
$moneyTotal += $content['subtotal'];
$numtotal += $num;
if ($success['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '盘点失败';
$this->ajaxReturn($res);
}
if ($num > 0) { //盘盈
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['warehouse_price'] = $val['cost_price'];
$new_arr['warehouse_num'] = $num;
array_push($warehousing_arr, $new_arr);
} else if ($num < 0) { //盘亏
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']);
array_push($stock_arr, $new_arr);
}
}
if (!empty($warehousing_arr)) {
//盘盈
$type = 3;
$stock = 3;
$res = $this->MerWarehousing($merchant_id, $operator_id, $supplier_id = 0, $warehouse_id, $remarks, $type, $warehousing_arr, $stock, $InventoryOrderNumber);
if ($res['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
$this->ajaxReturn($res);
}
}
if (!empty($stock_arr)) {
//盘亏
$type = 2;
$res = $this->MerStockOut($merchant_id, $store_id = 0, $operator_id, $warehouse_id, $remarks, $type, $stock_arr, $InventoryOrderNumber);
if ($res['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
$this->ajaxReturn($res);
}
}
$text['amount'] = $moneyTotal;
$text['quantity'] = $numtotal;
$text['goods_species'] = count($goodsList);
$text['status'] = 1;
$text['order_number'] = $InventoryOrderNumber;
$success = D('InventoryOrder')->updateData(array('id' => $InventoryOrderId), $text);
if ($success['status'] == 0) {
$res['status'] = 0;
$res['msg'] = '操作失败';
$this->ajaxReturn($res);
}
$res['status'] = 1;
$res['msg'] = '成功';
return $res;
}
//2019-10-9新接口
public function MerInventorying_V1($parameter)
{
$merchant_id = $parameter['merchant_id'];
$operator_id = $parameter['operator_id'];
$remarks = $parameter['remarks'];
$goodsList = $parameter['goodsList'];
$status = $parameter['status'] ? $parameter['status'] : 1;
$inventory_order_id = $parameter['inventory_order_id'] ? $parameter['inventory_order_id'] : null;
$stime = time();
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[0-9][0-9]*$/";
if (!$goodsList || !$merchant_id) {
$res['status'] = 0;
$res['msg'] = "缺少参数";
return $res;
}
if (count($goodsList) > 500) {
$res['status'] = 0;
$res['msg'] = "一次盘点商品上限为500种商品";
return $res;
}
$WarehouseModel = new SaleWarehouseModel();
$warehouse_id = $WarehouseModel->basisOrderGetFindField([
'merchant_id' => $merchant_id,
'status' => 1
], "id");
if (empty($warehouse_id)) {
$res['status'] = 0;
$res['msg'] = "请创建供给仓";
return $res;
}
foreach ($goodsList as $val) {
if (!$val['cost_price'] || !preg_match($reg1, $val['cost_price'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "成本价有误";
return $res;
}
if ($val['attribute_state'] == 1) {
if ($val['pricing_method'] == 1) {
//无称重
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg3, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
} else {
if (!preg_match($reg2, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg2, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['inventory_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确盘点数量";
return $res;
}
if (!preg_match($reg3, abs($val['goods_num']))) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误";
return $res;
}
}
}
if (empty($inventory_order_id)) {
//初始化直接盘点
$data = array(
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'operator_id' => $operator_id,
'add_time' => $stime
);
if ($status == 1) {
$data['inventory_time'] = $stime; //盘点提交时间
}
$InventoryOrder = D('InventoryOrder')->addData($data);
if ($InventoryOrder['status'] == 0) {
$res['status'] = 0;
$res['msg'] = "订单创建失败";
return $res;
}
$InventoryOrderId = $InventoryOrder['data'];
$InventoryOrderNumber = "MP" . orderNumber($InventoryOrderId); //盘点单
} else if (!empty($inventory_order_id)) {
//草稿箱的商品盘点
$InventoryOrderNumber = D('InventoryOrder')->getFindField(array('id' => $inventory_order_id), "order_number");
if (empty($InventoryOrderNumber)) {
$res = array(
'status' => 0,
'msg' => '未找到该盘点单号'
);
return $res;
}
$InventoryOrderId = $inventory_order_id;
}
$InventoryClass = new InventoryOperation();
if (C('IS_SET_REDIS')) {
$orderStateResult = $InventoryClass->testLock([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId
]);
if ($orderStateResult['status'] != 1) {
$res = array(
'status' => 0,
'msg' => '该订单正在操作中,请稍后重试'
);
return $res;
}
$InventoryClass->addLock([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId
]);
}
$moneyTotal = 0;
$numtotal = 0;
$warehousing_arr = array(); //入库的商品
$stock_arr = array(); //出库的商品
$inventory_goods_ids = array(); //最终提交的盘点商品
foreach ($goodsList as $key => &$val) {
$content = array(
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'inventory_order_id' => $InventoryOrderId,
'inventory_order_number' => $InventoryOrderNumber,
'add_time' => $stime,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'goods_num' => $val['goods_num'],
'cost_price' => $val['cost_price'],
'inventory_num' => $val['inventory_num'],
'remarks' => $val['remarks']
);
$num = round($val['inventory_num'] - $val['goods_num'], 3);
if ($num > 0) {
$content['type'] = 1;
} else if ($num < 0) {
$content['type'] = 2;
} else {
$content['type'] = 0;
}
$content['num'] = $num;
$content['subtotal'] = round($num * $val['cost_price'], 2);
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
if (!empty($inventory_order_id) && !empty($val['inventory_goods_id'])) {
array_push($inventory_goods_ids, $val['inventory_goods_id']);
$success = D('InventoryGoods')->updateData(array('id' => $val['inventory_goods_id']), $content);
} else {
$success = D('InventoryGoods')->addData($content);
if ($success['status'] == 1) {
array_push($inventory_goods_ids, $success['data']);
} else {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId,
]);
}
return $success;
}
}
$moneyTotal += $content['subtotal'];
$numtotal += $num;
if ($status == 1) {
if ($num > 0) { //盘盈
$new_arr = array();
$new_arr = $content;
$new_arr['id'] = $val['id'];
$new_arr['warehouse_price'] = $val['cost_price'];
$new_arr['warehouse_num'] = $num;
array_push($warehousing_arr, $new_arr);
} else if ($num < 0) { //盘亏
$new_arr = array();
$new_arr = $content;
$new_arr['stock_price'] = $val['cost_price'];
$new_arr['id'] = $val['id'];
$new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']);
array_push($stock_arr, $new_arr);
}
}
}
if (!empty($warehousing_arr)) {
//盘盈
$parameter = array(
'merchant_id' => $merchant_id,
'operator_id' => $operator_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'goodsList' => $warehousing_arr,
'type' => 3,
'stock' => 3,
'order_number' => $InventoryOrderNumber
);
$res = $this->MerWarehousing($parameter);
if ($res['status'] == 0) {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId,
]);
}
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
return $res;
}
}
if (!empty($stock_arr)) {
//盘亏
$parameter = array(
'merchant_id' => $merchant_id,
'operator_id' => $operator_id,
'warehouse_id' => $warehouse_id,
'remarks' => $remarks,
'type' => 2,
'goodsList' => $stock_arr,
'order_number' => $InventoryOrderNumber,
);
$res = $this->MerStockOut($parameter);
if ($res['status'] == 0) {
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId,
]);
}
$res['status'] = 0;
$res['msg'] = '入库单操作失败';
return $res;
}
}
if (!empty($inventory_order_id)) {
D('InventoryGoods')->deleteData(array('inventory_order_id' => $inventory_order_id, 'id' => array('not in', $inventory_goods_ids)));
}
$text = array(
'amount' => $moneyTotal,
'quantity' => $numtotal,
'goods_species' => count($goodsList),
'status' => $status,
'order_number' => $InventoryOrderNumber
);
$success = D('InventoryOrder')->updateData(array('id' => $InventoryOrderId), $text);
if ($success['status'] == 0) {
if (!empty($inventory_order_id)) {
$res = array(
'status' => 0,
'msg' => "暂无修改"
);
} else {
$res = array(
'status' => 0,
'msg' => '操作失败'
);
}
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId,
]);
}
return $res;
}
if (C('IS_SET_REDIS')) {
$InventoryClass->eliminate([
'user_type' => 3,
'merchant_id' => $merchant_id,
'order_id' => $InventoryOrderId,
]);
}
$res['status'] = 1;
$res['msg'] = '成功';
return $res;
}
/**
* 商户入库操作
* @param $param
* [
* merchant_id
* operator_id 操作人id
* supplier_id 供货商id
* remarks 备注
* type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收入库 7.门店申请调拨拒收入库
* goodsList 商品信息
* stock 采购库是否减少 1采购仓库减少 其他都不减少
* order_number 订单号实时盘点所需
* ]
* @return array
*/
public function MerWarehousing($param)
{
$verifyResult = $this->MerWarehousingVerify($param); //参数验证
if ($verifyResult['status'] == 0) {
return $verifyResult;
}
$warehouse_id = $verifyResult['data']; //仓库id
$time = $_SERVER['REQUEST_TIME'];
$data = [
'merchant_id' => $param['merchant_id'],
'warehouse_id' => $warehouse_id,
'remarks' => $param['remarks'],
'type' => $param['type'],
'add_time' => $time,
'retreat_time' => $time,
'operator_id' => $param['operator_id']
];
if (!empty($param['supplier_id'])) {
$data['supplier_id'] = $param['supplier_id'];
}
try {
M()->startTrans();
$WarehousingRecordModel = new WarehousingRecordModel();
$warehouseOrder = $WarehousingRecordModel->addData($data);
if ($warehouseOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$warehouseOrderId = $warehouseOrder['data'];
if (!empty($param['order_number'])) {
$warehouseOrderNumber = $param['order_number'];
} else {
$warehouseOrderNumber = 'MR' . orderNumber($warehouseOrderId);
}
$warehousing_param = [
'stock' => $param['stock'] ? $param['stock'] : '',
'warehouseOrderId' => $warehouseOrderId,
'goodsList' => $param['goodsList'],
'merchant_id' => $param['merchant_id'],
'warehouse_id' => $warehouse_id,
'supplier_id' => $param['supplier_id'] ? $param['supplier_id'] : 0,
'warehouseOrderNumber' => $warehouseOrderNumber,
'type' => $param['type'],
];
$warehousing_record = $this->MerchantWarehousingRecord($warehousing_param); //存入入库记录表
if ($warehousing_record['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $warehousing_record['message']];
}
$moneyTotal = $warehousing_record['data']['moneyTotal'] ? $warehousing_record['data']['moneyTotal'] : 0; //总金额
$text = [
'money_total' => $moneyTotal,
'goods_species' => count($param['goodsList']),
'real_goods_species' => count($param['goodsList']),
'real_money_total' => $moneyTotal,
'status' => 1,
'order_number' => $warehouseOrderNumber
];
$success = $WarehousingRecordModel->updateData(array('id' => $warehouseOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 商户入库的信息验证
* @param $param
* [
* merchant_id
* operator_id 操作人id
* supplier_id 供货商id
* remarks 备注
* type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收入库 7.门店申请调拨拒收入库
* goodsList 商品信息
* stock 采购库是否减少 1采购仓库减少 其他都不减少
* order_number 订单号实时盘点所需
* ]
* @return array
*/
public function MerWarehousingVerify(&$param)
{
//销售仓
$WarehouseClass = new Warehouse();
$warehouseResult = $WarehouseClass->getSaleWarehouseId([
'user_type' => 3,
'merchant_id' => $param['merchant_id']
]);
if ($warehouseResult['status'] != 1) {
$warehouseResult['msg'] = $warehouseResult['message'];
return $warehouseResult;
}
if (is_array($param['goodsList'])) {
$goodsList = $param['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
}
if (empty($goodsList) || !isset($param['type'])) {
return ['status' => 0, 'msg' => '缺少参数'];
}
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期'];
}
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' => '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['warehouse_num'])) {
return ['status' => 0, 'msg' => '请输入正确数量'];
}
}
} 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['serial_number_state'] == 1) {
$serialResult = $SerialClass->serialVerify([
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']];
}
if ($val['warehouse_num'] != count($val['serial_list'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '入库数量有误'];
}
}
}
$param['goodsList'] = $goodsList;
return ['status' => 1, 'msg' => '验证成功', 'data' => $warehouseResult['data']];
}
/**
* 商户入库记录表操作
* @param $parameter
* [
* stock 1表示采购入库,需要减去采购库库存
* warehouseOrderId 入库单id
* warehouseOrderNumber 入库订单号
* goodsList 入库的商品信息 array
* merchant_id 商户id
* warehouse_id 仓库id
* type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收 7门店申请调拨拒收入库
* ]
* @return array
* [
* status
* message
* data=>[
* lose 入库存入失败的商品信息
* cost 成本价记录失败的商品信息
* moneyTotal 总入库金额
* ]
* ]
*/
public function MerchantWarehousingRecord($parameter)
{
try {
$PurchaseGoods = new PurchaseGoodsModel();
$WarehousingGoods = new WarehousingGoodsModel();
$SaleWarehouseModel = new SaleWarehouseModel();
$SerialClass = new SerialNumberGoods();
$stock = $parameter['stock'] ? $parameter['stock'] : ''; //1表示采购入库,需要减去采购库库存
$warehouseOrderId = $parameter['warehouseOrderId'] ? $parameter['warehouseOrderId'] : 0; //入库单id
$goodsList = $parameter['goodsList'];
$merchant_id = $parameter['merchant_id']; //商户id
if (empty($parameter['warehouse_id'])) {
$warehouse_info = $SaleWarehouseModel->getFind(array('merchant_id' => $merchant_id, 'status' => 1)); //仓库id
$warehouse_id = $warehouse_info['id'];
} else {
$warehouse_id = $parameter['warehouse_id']; //仓库id
}
$supplier_id = $parameter['supplier_id'] ? $parameter['supplier_id'] : 0; //供货商id
$warehouseOrderNumber = $parameter['warehouseOrderNumber'] ? $parameter['warehouseOrderNumber'] : ''; //入库订单号
$type = $parameter['type']; //入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收 7门店申请调拨拒收入库
$time = $_SERVER['REQUEST_TIME'];
$moneyTotal = 0; //总金额
foreach ($goodsList as $key => &$val) {
$content = [
'warehouse_record_id' => $warehouseOrderId,
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'supplier_id' => $supplier_id,
'warehouse_order_number' => $warehouseOrderNumber,
'type' => $type,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'sku_name' => $val['sku_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'warehouse_price' => $val['warehouse_price'],
'warehouse_num' => $val['warehouse_num'],
'surplus_num' => $val['warehouse_num'],
'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'] * 1, 2),
'remarks' => $val['remarks'] ? $val['remarks'] : '',
'purchase_order_number' => $val['order_number'] ? $val['order_number'] : '',
'purchase_warehouse_id' => $val['warehouse_id'] ? $val['warehouse_id'] : null,
'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $WarehousingGoods->addData($content);
if ($success['status'] == 0) {
return callBack(statusCode()['error'], '入库记录添加失败');
}
//入库串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->warehouseSerial([
'user_type' => 3,
'merchant_id' => $merchant_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'type' => $type,
'add_time' => $time,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
return callBack(statusCode()['error'], '串号记录添加失败');
}
}
$moneyTotal += $content['subtotal'];
$map = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'goods_id' => $content['goods_id'],
];
if ($content['attribute_state'] == 2) {
$map['sku_id'] = $content['sku_id'];
}
$success = $this->MerGoodsStockOperation($map, $content);
if ($success['status'] == 0) {
return callBack(statusCode()['error'], '成本价记录失败');
}
if ($stock == 1) { //采购入库
$tap = array();
$tap['id'] = $val['id'];
$tap['merchant_id'] = $merchant_id;
$tap['warehouse_id'] = $val['warehouse_id'];
$tap['goods_id'] = $val['goods_id'];
if ($content['attribute_state'] == 2) {
$tap['sku_id'] = $content['sku_id'];
}
$PurchaseGoods->updateSetDec($tap, "surplus_num", $content['warehouse_num']);
$PurchaseGoods->updateSetInc($tap, "warehousing_num", $content['warehouse_num']);
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->warehousePurchaseSerial([
'user_type' => 3,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
return callBack(statusCode()['error'], '采购商品串号信息修改失败');
}
}
}
}
return callBack(statusCode()['success'], '入库成功', ['moneyTotal' => $moneyTotal]);
} catch (\Exception $e) {
return callBack(statusCode()['error'], '入库失败', ['moneyTotal' => 0]);
}
}
/**
* 商户出库
* @param $param
* [
* operator_id 操作人id
* merchant_id
* supplier_id 供货商id
* store_id
* warehouse_id 仓库id
* remarks 备注
* type 0其他出库 1调拨出库 2盘亏出库 3门店申请调拨出库 4退货出库
* goodsList 商品信息
* order_number 订单号
* ]
* @return mixed
*/
public function MerStockOut($param)
{
$verifyResult = $this->MerStockOutVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$warehouse_id = $verifyResult['data']['warehouse_id']; //仓库id
$store_arr = $verifyResult['data']['store_arr']; //门店
$merchant_id = $param['merchant_id'];
$supplier_id = $param['supplier_id'];
$time = $_SERVER['REQUEST_TIME'];
$goodsList = $param['goodsList'];
$type = $param['type'];
try {
M()->startTrans();
$StockOutOrderModel = new StockOutOrderModel();
$StockOutGoodsModel = new StockOutGoodsModel();
$SSaleWarehouseModel = new SSaleWarehouseModel();
$SWarehousingRecordModel = new SWarehousingRecordModel();
$SaleMGoodsModel = new SaleMGoodsModel();
$SkuGoodsModel = new SkuMGoodsModel();
$GoodsModel = new RetailMgoodsModel();
$CostPriceRecordModel = new CostPriceRecordModel();
$RetreatReceivablesModel = new RetreatReceivablesModel();
$SerialClass = new SerialNumberGoods();
foreach ($store_arr as $sval) {
$data = [
'merchant_id' => $merchant_id,
'store_id' => $sval,
'warehouse_id' => $warehouse_id,
'remarks' => $param['remarks'],
'type' => $type,
'add_time' => $time,
'operator_id' => $param['operator_id']
];
if ($type == 4) {
$data['supplier_id'] = $supplier_id;
}
$StockOutOrder = $StockOutOrderModel->addData($data);
if ($StockOutOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$StockOutOrderId = $StockOutOrder['data'];
if (!empty($param['order_number'])) {
$StockOutOrderNumber = $param['order_number'];
} else {
switch ($type) {
case 0:
$order_name = "MQ";
break;
case 1:
$order_name = "MD";
break;
case 2:
$order_name = "MP";
break;
case 4:
$order_name = "MG";
break;
}
$StockOutOrderNumber = $order_name . orderNumber($StockOutOrderId);
}
if ($type == 1 || $type == 3) {
//调拨出库门店入库单
$store_warehouse = [
'merchant_id' => $merchant_id,
'store_id' => $sval,
'remarks' => $param['remarks']
];
$store_warehouse['warehouse_id'] = $SSaleWarehouseModel->getFindField(array('merchant_id' => $merchant_id, 'store_id' => $sval, 'status' => 1), "id");
if ($type == 1) {
$store_warehouse['type'] = 4;
} else if ($type == 3) {
$store_warehouse['type'] = 6;
}
$store_warehouse['allocation_time'] = $time;
$store_warehouse['stock_out_id'] = $StockOutOrderId;
$store_warehouse_info = $SWarehousingRecordModel->addData($store_warehouse);
if ($store_warehouse_info['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '门店入库订单创建失败'];
}
$warehouse_record_id = $store_warehouse_info['data'];
}
$moneyTotal = 0; //出库总金额
$total_cost_price = 0; //总成本价;
foreach ($goodsList as $val) {
$content = array(
'merchant_id' => $merchant_id,
'store_id' => $sval,
'warehouse_id' => $warehouse_id,
'stock_out_id' => $StockOutOrderId,
'stock_order_number' => $StockOutOrderNumber,
'type' => $type,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'stock_price' => $val['stock_price'],
'cost_price' => $val['cost_price'],
'stock_num' => $val['output_num'],
'subtotal' => round($val['stock_price'] * $val['output_num'] * 1, 2),
'remarks' => $val['remarks'],
'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null,
'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '',
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
);
if ($type == 1 || $type == 3) {
$content['warehouse_record_id'] = $warehouse_record_id;
}
if ($type == 4) {
$content['supplier_id'] = $supplier_id;
}
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $StockOutGoodsModel->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '出库失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->stockSerial([
'user_type' => 3,
'merchant_id' => $merchant_id,
'outside_id' => $success['data'],
'type' => $type,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list']
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => '串号保存失败'];
}
}
$moneyTotal += $content['subtotal'];
$total_cost_price += round($content['cost_price'] * $content['stock_num'], 2);
$where = [
'merchant_id' => $merchant_id,
'goods_id' => $val['goods_id'],
'status' => ['in', '0,1']
];
if ($val['attribute_state'] == 2) {
$where['sku_id'] = $val['sku_id'];
}
$goods_total_num = $SaleMGoodsModel->getFindField($where, "goods_num");
$SaleMGoodsModel->updateSetDec($where, "goods_num", $val['output_num']);
if ($goods_total_num > 0) {
$ware_arr = [
'merchant_id' => $merchant_id,
'goods_id' => $val['goods_id'],
'surplus_num' => ['gt', 0],
];
if ($val['attribute_state'] == 2) {
$ware_arr['sku_id'] = $val['sku_id'];
}
$this->MerWarehouseReduce($ware_arr, $val['output_num']);
//串号信息操作
if ($val['serial_number_state'] == 1) {
$serial_id_arr = array_column($val['serial_list'], 'id');
$serialResult = $SerialClass->warehouseSerialDec([
'user_type' => 3,
'serial_id_arr' => $serial_id_arr,
'type' => 1,
'merchant_id' => $merchant_id,
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
//退货出库完重新计算成本价
if ($type == 4) {
$cost_map = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'goods_id' => $content['goods_id']
];
if ($content['attribute_state'] == 2) {
$cost_map['sku_id'] = $content['sku_id'];
}
$success = $this->MerCostPrice($cost_map);
if ($success['status'] == 1) {
$cost_price = round($success['data'], 2);
if ($cost_price > 0) {
$SaleMGoodsModel->updateData($cost_map, array('cost_price' => $cost_price));
if (!empty($cost_map['sku_id'])) {
$SkuGoodsModel->updateOrder([
'id' => $cost_map['sku_id'],
'mgoods_id' => $cost_map['goods_id']
], [
'purch_price' => $cost_price
]);
} else {
$GoodsModel->updateOrder(array('id' => $cost_map['goods_id']), array('purch_price' => $cost_price));
}
$cost_content = [
'merchant_id' => $merchant_id,
'cost_price' => $cost_price,
'goods_id' => $content['goods_id'],
'sku_id' => $content['sku_id'] ? $content['sku_id'] : 0,
'purchase_price' => $content['stock_price'],
'goods_class_id' => $content['goods_class_id'],
'attribute_state' => $content['attribute_state'],
'pricing_method' => $content['pricing_method'],
'add_time' => $content['add_time'],
'type' => 2
];
$CostPriceRecordModel->addData($cost_content);
}
}
}
}
}
$text = array(
'money_total' => $moneyTotal,
'total_cost_price' => $total_cost_price,
'goods_species' => count($goodsList),
'status' => 1,
'order_number' => $StockOutOrderNumber
);
if ($type == 1 || $type == 3) {
$text['warehouse_record_id'] = $warehouse_record_id;
}
$success = $StockOutOrderModel->updateData(array('id' => $StockOutOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
switch ($type) {
case 1:
case 3:
unset($text['status']);
$success = $SWarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
break;
case 4:
//生成退货资金
$capital_arr = [
'merchant_id' => $merchant_id,
'supplier_id' => $supplier_id,
'retreat_order_id' => $StockOutOrderId,
'retreat_order_number' => $StockOutOrderNumber,
'operator_id' => $param['operator_id'],
'retreat_time' => $time,
'collect_money' => $moneyTotal,
'type' => 2 //2已入库的退货
];
$success = $RetreatReceivablesModel->addData($capital_arr);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
}
break;
}
}
M()->commit();
if ($type == 3) {
$res['stockOrderId'] = $StockOutOrderId;
$res['warehouseOrderId'] = $warehouse_record_id;
$res['goods_species'] = count($goodsList);
$res['money_total'] = $moneyTotal;
}
$res['status'] = 1;
$res['msg'] = '成功';
return $res;
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 商户出库参数验证
* @param $param
* [
* operator_id 操作人id
* merchant_id
* supplier_id 供货商id
* store_id
* warehouse_id 仓库id
* remarks 备注
* type 0其他出库 1调拨出库 2盘亏出库 3门店申请调拨出库 4退货出库
* goodsList 商品信息
* order_number 订单号
* ]
* @return mixed
*/
public function MerStockOutVerify(&$param)
{
if (!empty($param['warehouse_id'])) {
$warehouse_id = $param['warehouse_id'];
} else {
$SaleWarehouseModel = new SaleWarehouseModel();
$warehouse_id = $SaleWarehouseModel->getFindField(['merchant_id' => $param['merchant_id'], 'status' => 1], "id");
if (empty($warehouse_id)) {
return ['status' => 0, 'msg' => '请先创建供给仓'];
}
}
if (is_array($param['goodsList'])) {
$goodsList = $param['goodsList'];
} else {
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
}
if (empty($goodsList) || !isset($param['type']) || empty($param['merchant_id'])) {
return ['status' => 0, 'msg' => '缺少必要参数'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单此操作上限为500种商品'];
}
if ($param['type'] == 1 && (empty($param['store_id']) && $param['store_id'] != 0)) {
return ['status' => 0, 'msg' => '请选择门店'];
}
if ($param['type'] == 4 && empty($param['supplier_id'])) {
return ['status' => 0, 'msg' => '请选择供货商'];
}
$store_arr = [];
if ($param['type'] == 1 || $param['type'] == 3) {
//所有门店
if ($param['store_id'] == 0) {
$where = [
'merchantid' => $param['merchant_id'],
'state' => 0
];
$StoreModel = new RetailStoreModel();
$store_arr = $StoreModel->getFindField($where, "id", true);
} else {
if (empty($param['store_id'])) {
return ['status' => 0, 'msg' => '请选择调拨的门店'];
}
array_push($store_arr, $param['store_id']);
}
$SSaleWarehouseModel = new SSaleWarehouseModel();
foreach ($store_arr as $val) {
$success = $SSaleWarehouseModel->getFindField(array('merchant_id' => $param['merchant_id'], 'store_id' => $val, 'status' => 1), "id");
if (!$success) {
return ['status' => 0, 'msg' => '门店暂无供给仓'];
}
}
} else {
$store_arr = [0];
}
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
foreach ($goodsList as $val) {
if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期'];
}
if (empty($val['stock_price'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if (!preg_match($reg1, $val['stock_price'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格'];
}
if ($val['attribute_state'] == 1 && $val['pricing_method'] == 2) {
if (!preg_match($reg2, $val['output_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg3, $val['output_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['output_num'] * 1 > $val['goods_num'] * 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于库存数量'];
}
if ($param['type'] == 1) {
if ($param['store_id'] == 0) {
if ($val['output_num'] * count($store_arr) * 1 > $val['goods_num'] * 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于库存数量'];
}
}
}
//串号信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list']) || count($val['serial_list']) != $val['output_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号信息数量不足'];
}
if (count($store_arr) > 1) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号商品禁止多门店同时调拨'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功', [
'warehouse_id' => $warehouse_id,
'store_arr' => $store_arr
]);
}
/**
* 商户商品库存增加成本价重置
*
*/
public function MerGoodsStockOperation($where, $data)
{
$SaleMGoodsModel = new SaleMGoodsModel();
$info = $SaleMGoodsModel->getFind($where);
if (!empty($info)) {
$SaleMGoodsModel->updateSetInc($where, "goods_num", $data['warehouse_num']);
if ($info['cost_price'] != $data['warehouse_price']) {//入库价与成本价不一样
$success = $this->MerCostPrice($where);
if ($success['status'] == 1) {
$cost_price = $success['data'];
$SaleMGoodsModel->updateData($where, array('cost_price' => $cost_price));
if (!empty($where['sku_id'])) {
$SkuGoodsModel = new SkuMGoodsModel();
$SkuGoodsModel->updateOrder(array('id' => $where['sku_id'], 'mgoods_id' => $where['goods_id']), array('purch_price' => $cost_price));
} else {
$RetailGoodsModel = new RetailMgoodsModel();
$RetailGoodsModel->updateOrder(array('id' => $where['goods_id']), array('purch_price' => $cost_price));
}
} else {
$res['status'] = 0;
$res['msg'] = '入库出错';
}
} else {
$cost_price = $data['warehouse_price'];
}
if ($cost_price) {
$cost_record = array(
'merchant_id' => $where['merchant_id'],
'cost_price' => $cost_price,
'goods_id' => $where['goods_id'],
'purchase_price' => $data['warehouse_price'],
'goods_class_id' => $data['goods_class_id'],
'attribute_state' => $data['attribute_state'],
'pricing_method' => $data['pricing_method'],
'add_time' => $data['add_time']
);
if ($data['attribute_state'] == 2) {
$cost_record['sku_id'] = $where['sku_id'];
}
$CostPriceRecordModel = new CostPriceRecordModel();
$success = $CostPriceRecordModel->addData($cost_record);
if ($success['status'] == 1) {
$res['status'] = 1;
$res['msg'] = '成功';
} else {
$res['status'] = 0;
$res['msg'] = '成本价记录失败';
}
}
} else {
$res['status'] = 0;
$res['msg'] = '未找到该商品';
}
return $res;
}
/*商户成本价计算
* $priceTotal 当前总成本价
* $numTotal 当前总库存
*/
public function MerCostPrice($where)
{
$where['surplus_num'] = array('gt', 0);
$fields = "surplus_num,warehouse_price";
$order = "add_time asc";
$WarehousingGoodsModel = new WarehousingGoodsModel();
$list = $WarehousingGoodsModel->getSelect($where, $page = '', $limit = '', $fields, $order);
if (!empty($list)) {
$priceTotal = 0;
$numTotal = 0;
foreach ($list as $val) {
$priceTotal += $val['surplus_num'] * $val['warehouse_price'];
$numTotal += $val['surplus_num'];
}
$cost_price = round(($priceTotal / $numTotal), 2);
$res['status'] = 1;
$res['data'] = $cost_price;
} else {
$res['status'] = 0;
$res['msg'] = '该商品已售完';
}
return $res;
}
/**
* 商户商品出库明细库存减少
* @param $where 入库记录条件
* @param $total_num 总数
*/
public function MerWarehouseReduce($where, $total_num)
{
$ware_goods = D('WarehousingGoods')->getSelect($where, '', '', "id,surplus_num", "id asc");
if ($ware_goods) {
$stock_arr = array();
foreach ($ware_goods as $v) {
if ($v['surplus_num'] >= $total_num) {
$ware_push = array(
'id' => $v['id'],
'num' => $total_num
);
array_push($stock_arr, $ware_push);
break;
} else {
$ware_push = array(
'id' => $v['id'],
'num' => $v['surplus_num']
);
array_push($stock_arr, $ware_push);
$total_num = round($total_num - $v['surplus_num'], 3);
}
}
if (!empty($stock_arr)) {
foreach ($stock_arr as $tval) {
D('WarehousingGoods')->updateSetDec(array('id' => $tval['id']), "surplus_num", $tval['num']);
}
}
}
}
/*商户的门店间调拨审核操作
*@param $id 出库单id
*@param $type 门店调拨出库商户审核 0未审核 1审核通过 2审核失败
*/
public function MerExamine($parameter)
{
$id = $parameter['id'];
$type = $parameter['type'];
if (!$id || !$type) {
return ['status' => 0, 'msg' => '参数缺失'];
}
$data['examine_status'] = $type;
try {
$SStockOutOrderModel = new SStockOutOrderModel();
$success = $SStockOutOrderModel->updateData(array('id' => $id), $data);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '操作失败'];
}
$SWarehousingRecordModel = new SWarehousingRecordModel();
$success = $SWarehousingRecordModel->updateData(array('stock_out_id' => $id, 'type' => 5), $data);
if ($success['status'] == 0) {
return ['status' => 0, 'msg' => '操作失败'];
}
$SStockOutGoodsModel = new SStockOutGoodsModel();
$stockList = $SStockOutGoodsModel->getSelect(array('stock_out_id' => $id), '', '', "id,goods_id,sku_id,attribute_state,stock_num,serial_number_state");
switch ($type) {
case 1:
if ($stockList) {
foreach ($stockList as $val) {
$where = [
'goods_id' => $val['goods_id'],
'surplus_num' => array('gt', 0)
];
if ($val['attribute_state'] == 2) {
$where['sku_id'] = $val['sku_id'];
}
$this->WarehouseReduce($where, $val['stock_num']);
}
}
break;
case 2:
if (!empty($stockList)) {
$SStockOutGoodsModel->updateData(array('stock_out_id' => $id), array('examine_status' => 2));
$SSaleMGoodsModel = new SSaleMGoodsModel();
$SStockSerialModel = new SStockGoodsSerialModel();
$SerialClass = new SerialNumberGoods();
foreach ($stockList as $val) {
$where = [
'goods_id' => $val['goods_id']
];
if ($val['attribute_state'] == 2) {
$where['sku_id'] = $val['sku_id'];
}
$SSaleMGoodsModel->updateSetInc($where, "goods_num", $val['stock_num']);
//串号信息
if ($val['serial_number_state'] == 1) {
$where['outside_id'] = $val['id'];
$where['num'] = ['gt', 0];
$main_serial_number_arr = $SStockSerialModel->getFindField($where, 'main_serial_number', true);
if (!empty($main_serial_number_arr)) {
$SerialClass->recoverySerialInc(['user_type' => 4, 'main_serial_number_arr' => $main_serial_number_arr]);
}
}
}
}
break;
}
$res['status'] = 1;
$res['msg'] = '操作成功';
return $res;
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
//商户供货商信息
public function MerSupplierInfo($supplier_id)
{
$supplierInfo = D("Supplier")->getFieldInfo(array("id" => $supplier_id), "advance_money,bank_card,bank_name");
$res = array(
'status' => 1,
'msg' => "查询成功",
'advanceMoney' => $supplierInfo['advance_money'],
'bank_card' => $supplierInfo['bank_card'],
'bank_name' => $supplierInfo['bank_name'],
);
return $res;
}
/*商户付款操作
*@param $payable_id 应付款id
*@param $pay_type 付款方式 1预付款方式 2微信3支付宝 4线下 5银行卡
* @param $advance_money 应付款
* @param $pay_money 付款金额
* @param $remarks 备注
* @param $add_time 付款时间
* @param $bank_card 银行卡号
* @param $bank_name 银行id
* @param $purchase_order_number 采购订单号
* @param supplier_id 供货商id
*/
public function MerPayment($data, $merchant_id, $operator_id)
{
$CapitalModel = D("PurchaseCapital");
$PayableModel = D("PurchasePayable");
$SupplierModel = D("Supplier");
$payable_id = $data['payable_id'];
$pay_type = $data['pay_type'];
$advance_money = $data['advance_money'];
$pay_money = $data['pay_money'];
$remarks = $data['remarks'];
$pay_time = $data['add_time'];
$bank_card = $data['bank_card'];
$bank_name = $data['bank_name'];
$purchase_order_number = $data['purchase_order_number'];
$supplier_id = $data['supplier_id'];
if (!$pay_type || !$pay_money || !$pay_time || !$purchase_order_number || !$supplier_id || !$payable_id) {
$res = array(
'status' => 0,
'msg' => '参数缺失'
);
return $res;
}
if ($pay_type == 1 && (!$advance_money || $advance_money < $pay_money)) {
$res = array(
'status' => 0,
'msg' => '预付款金额有误'
);
return $res;
}
if ($pay_type == 5 && (!$bank_card || !$bank_name)) {
$res = array(
'status' => 0,
'msg' => '银行卡信息或开户银行有误'
);
return $res;
}
$payableInfo = $PayableModel->getFind(array($PayableModel::ID => $payable_id));
if (!$payableInfo) {
$res = array(
'status' => 0,
'msg' => '未找到改采购应付款订单',
);
return $res;
}
$stay_money = round($payableInfo['payable_money'] - $payableInfo['paid_money'], 2); //待付金额
if ($stay_money <= 0) {
$res = array(
'status' => 0,
'msg' => '该采购单应付金额已全部结清,请勿重复操作',
);
return $res;
}
if ($pay_money > $stay_money) {
$res = array(
'status' => 0,
'msg' => '付款金额不能大于待付金额',
);
return $res;
}
$content = array(
$CapitalModel::MERCHANT_ID => $merchant_id,
$CapitalModel::SUPPLIER_ID => $supplier_id,
$CapitalModel::OPERATOR_ID => $operator_id,
$CapitalModel::PURCHASE_ORDER_NUMBER => $purchase_order_number,
$CapitalModel::PAY_TYPE => $pay_type,
$CapitalModel::PAY_MONEY => $pay_money,
$CapitalModel::REMARKS => $remarks,
$CapitalModel::PAY_TIME => strtotime($pay_time),
$CapitalModel::ADD_TIME => time()
);
if ($pay_type == 5) {
$content[$CapitalModel::BANK_CARD] = $bank_card;
$content['bank_name'] = $bank_name;
}
$res = $CapitalModel->addData($content);
if ($res['status'] == 1) {
if ($pay_type == 1) {
$SupplierModel->updateSetDec(array('id' => $supplier_id), "advance_money", $pay_money);
}
$PayableModel->updateSetInc(array($PayableModel::ID => $payable_id), $PayableModel::PAID_MONEY, $pay_money);
if (round($pay_money - $stay_money, 2) == 0) {
$able[$PayableModel::PAY_STATUS] = 3;
} else {
$able[$PayableModel::PAY_STATUS] = 2;
}
$PayableModel->updateData(array($PayableModel::ID => $payable_id), $able);
$add_id = $res['data'];
$order_number = 'MY' . orderNumber($add_id);
$res = $CapitalModel->updateData(array($CapitalModel::ID => $add_id), array($CapitalModel::ORDER_NUMBER => $order_number));
}
return $res;
}
//商户采购资金流水
public function MerCapitalList($where, $page, $limit, $fields)
{
$CapitalModel = D("PurchaseCapital");
$CapitalList = $CapitalModel->getSelect($where, $page, $limit, $fields);
if ($CapitalList) {
$count = $CapitalModel->getCount($where);
foreach ($CapitalList as $key => &$val) {
$val['index'] = $key + 1;
$val['pay_money'] = round($val['pay_money'], 2);
$val['pay_time'] = date('Y-m-d H:i:s', $val['pay_time']);
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
$val['operator_name'] = $this->OperatorName($val['operator_id']);
$val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
switch ($val[$CapitalModel::PAY_TYPE]) {
case 1:
$val['pay_name'] = "预付款方式";
break;
case 2:
$val['pay_name'] = "微信";
break;
case 3:
$val['pay_name'] = "支付宝";
break;
case 4:
$val['pay_name'] = "线下";
break;
case 5:
$val['pay_name'] = "银行卡";
break;
}
}
}
$CapitalList = $CapitalList ? $CapitalList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $CapitalList,
'count' => $count
);
return $res;
}
//商户预付款列表
public function MerAdvanceList($where, $page, $limit, $fields)
{
$advanceList = D("Supplier")->getSelect($where, $page, $limit, $fields);
if ($advanceList) {
$count = D("Supplier")->getCount($where);
foreach ($advanceList as $key => &$val) {
$val['index'] = $key + 1;
$val['advance_money'] = round($val['advance_money'], 2);
}
}
$advanceList = $advanceList ? $advanceList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'data' => $advanceList,
'count' => $count,
'msg' => "查询成功"
);
return $res;
}
//商户预付款
public function MerAdvanceOperation($data, $merchant_id, $operator_id)
{
$reg = '/^[0-9]+(.[0-9]{1,2})?$/';
$SupplierModel = D("Supplier");
$AdvanceModel = D("AdvancePayment");
if (!$data['supplier_id']) {
$res = array(
'status' => 0,
'msg' => "参数缺失"
);
return $res;
}
if (empty($data['type'])) {
$res = array(
'status' => 0,
'msg' => "请选择预付款类型"
);
return $res;
}
if (empty($data['money']) || !preg_match($reg, $data['money'])) {
$res = array(
'status' => 0,
'msg' => "请输入正确金额"
);
return $res;
}
if ($data['money'] > 100000) {
$res = array(
'status' => 0,
'msg' => "金额不能超过10万元"
);
return $res;
}
$type = $data['type'];
$money = $data['money'];
$supplier_id = $data['supplier_id'];
$where['id'] = $supplier_id;
$advanceMoney = $SupplierModel->getFindField($where, "advance_money");
switch ($type) {
case 1:
$success = $SupplierModel->updateSetInc($where, "advance_money", $money);
break;
case 2:
if (round($advanceMoney - $money, 2) < 0) {
$res = array(
'status' => 0,
'msg' => "减少金额不能大于总余额"
);
return $res;
}
$success = $SupplierModel->updateSetDec($where, "advance_money", $money);
break;
}
if ($success) {
$content = array(
$AdvanceModel::MERCHANT_ID => $merchant_id,
$AdvanceModel::SUPPLIER_ID => $supplier_id,
$AdvanceModel::OPERATOR_ID => $operator_id,
$AdvanceModel::TYPE => $type,
$AdvanceModel::MONEY => $money,
$AdvanceModel::ADD_TIME => time()
);
$res = $AdvanceModel->addData($content);
if ($res['status'] == 0) {
$res['msg'] = '暂无修改';
}
} else {
$res = array(
'status' => 0,
'msg' => '暂无改变'
);
}
return $res;
}
//商户预付款记录
public function MerRecord($where, $page, $limit, $fields)
{
$AdvanceModel = D("AdvancePayment");
$recordList = $AdvanceModel->getSelect($where, $page, $limit, $fields);
if ($recordList) {
$count = $AdvanceModel->getCount($where);
foreach ($recordList as $key => &$val) {
$val['index'] = $key + 1;
$val['add_time'] = date("Y-m-d H:i:s", $val['add_time']);
$val['money'] = round($val['money'], 2);
if ($val['type'] == 1) {
$val['type_name'] = "增加";
} else if ($val['type'] == 2) {
$val['type_name'] = "减少";
}
$val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
$val['operator_name'] = $this->OperatorName($val['operator_id']);
}
}
$count = $count ? $count : 0;
$recordList = $recordList ? $recordList : array();
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $recordList,
'count' => $count
);
return $res;
}
//商户退货应收款列表
public function MerReceivableList($where, $page, $limit, $fields)
{
$RetreatReceivablesModel = D("RetreatReceivables");
$RetreatList = $RetreatReceivablesModel->getSelect($where, $page, $limit, $fields);
$TotalRetreatList = $RetreatReceivablesModel->getSelect($where, $page = '', $limit = '', "*");
if ($RetreatList) {
$count = $RetreatReceivablesModel->getCount($where);
foreach ($RetreatList as $key => &$val) {
$val['index'] = $key + 1;
$val[$RetreatReceivablesModel::RETREAT_TIME] = date("Y-m-d H:i:s", $val[$RetreatReceivablesModel::RETREAT_TIME]);
$val[$RetreatReceivablesModel::COLLECT_MONEY] = round($val[$RetreatReceivablesModel::COLLECT_MONEY], 2);
$val[$RetreatReceivablesModel::RECEIVED_MONEY] = round($val[$RetreatReceivablesModel::RECEIVED_MONEY], 2);
$val['stay_money'] = round($val[$RetreatReceivablesModel::COLLECT_MONEY] - $val[$RetreatReceivablesModel::RECEIVED_MONEY], 2);
$val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val[$RetreatReceivablesModel::SUPPLIER_ID]), "supplier_name");
$val['operator'] = $this->OperatorName($val[$RetreatReceivablesModel::OPERATOR_ID]);
switch ($val[$RetreatReceivablesModel::PAY_STATUS]) {
case 1:
$val['pay_name'] = "待收款";
break;
case 2:
$val['pay_name'] = "部分收款";
break;
case 3:
$val['pay_name'] = "已收款";
break;
}
}
unset($val);
}
$collect_money = 0; //应收
$received_money = 0; //已收
$stay_money = 0; //待收
if ($TotalRetreatList) {
foreach ($TotalRetreatList as $val) {
$collect_money += $val['collect_money'];
$received_money += $val['received_money'];
}
}
$stay_money = round($collect_money - $received_money, 2);
$RetreatList = $RetreatList ? $RetreatList : array();
$count = $count ? $count : 0;
$TotalList = array(
array(
'collect_money' => $collect_money,
'received_money' => $received_money,
'stay_money' => $stay_money
)
);
$res = array(
'status' => 1,
'msg' => '查询成功',
'data' => $RetreatList,
'TotalList' => $TotalList,
'count' => $count,
);
return $res;
}
/*商户退货收款
* @param receivables_id 应收款id
* @param $pay_type 付款方式 2微信3支付宝 4线下 5银行卡
* @param $collect_money 收款金额
* @param remarks 备注
* @param add_time 收款时间
* @param bank_card 银行卡号
* @param bank_name 银行id
* @param retreat_order_number 采购退货单号
* @param supplier_id 供货商id
*/
public function MerCollect($data, $merchant_id, $operator_id)
{
$CapitalModel = D("RetreatCapital");
$RetreatReceivablesModel = D("RetreatReceivables");
$receivables_id = $data['receivables_id'];
$pay_type = $data['pay_type'];
$collect_money = $data['collect_money'];
$remarks = $data['remarks'];
$collect_time = $data['add_time'];
$bank_card = $data['bank_card'];
$bank_name = $data['bank_name'];
$retreat_order_number = $data['retreat_order_number'];
$supplier_id = $data['supplier_id'];
if (!$pay_type || !$collect_money || !$collect_time || !$retreat_order_number || !$supplier_id || !$receivables_id) {
$res = array(
'status' => 0,
'msg' => '参数缺失'
);
return $res;
}
if ($pay_type == 5 && (!$bank_card || !$bank_name)) {
$res = array(
'status' => 0,
'msg' => '银行卡信息或开户银行有误'
);
return $res;
}
$receivableInfo = $RetreatReceivablesModel->getFind(array($RetreatReceivablesModel::ID => $receivables_id));
if (!$receivableInfo) {
$res = array(
'status' => 0,
'msg' => '未找到改退货收款订单',
);
return $res;
}
$stay_money = round($receivableInfo['collect_money'] - $receivableInfo['received_money'], 2); //待收金额
if ($stay_money <= 0) {
$res = array(
'status' => 0,
'msg' => '该退货单应付金额已全部结清,请勿重复操作',
);
return $res;
}
if ($collect_money > $stay_money) {
$res = array(
'status' => 0,
'msg' => '收款金额不能大于待收金额',
);
return $res;
}
$content = array(
$CapitalModel::MERCHANT_ID => $merchant_id,
$CapitalModel::SUPPLIER_ID => $supplier_id,
$CapitalModel::OPERATOR_ID => $operator_id,
$CapitalModel::RETREAT_ORDER_NUMBER => $retreat_order_number,
$CapitalModel::PAY_TYPE => $pay_type,
$CapitalModel::COLLECT_MONEY => $collect_money,
$CapitalModel::REMARKS => $remarks,
$CapitalModel::COLLECT_TIME => strtotime($collect_time),
$CapitalModel::ADD_TIME => time()
);
if ($pay_type == 5) {
$content[$CapitalModel::BANK_CARD] = $bank_card;
$content['bank_name'] = $bank_name;
}
$res = $CapitalModel->addData($content);
if ($res['status'] == 1) {
$RetreatReceivablesModel->updateSetInc(array($RetreatReceivablesModel::ID => $receivables_id), $RetreatReceivablesModel::RECEIVED_MONEY, $collect_money);
if (round($collect_money - $stay_money, 2) == 0) {
$able[$RetreatReceivablesModel::PAY_STATUS] = 3;
} else {
$able[$RetreatReceivablesModel::PAY_STATUS] = 2;
}
$RetreatReceivablesModel->updateData(array($RetreatReceivablesModel::ID => $receivables_id), $able);
$add_id = $res['data'];
$order_number = "MS" . orderNumber($add_id);
$res = $CapitalModel->updateData(array($CapitalModel::ID => $add_id), array($CapitalModel::ORDER_NUMBER => $order_number));
}
return $res;
}
public function MerRetreatCapitalList($where, $page, $limit, $fields)
{
$RetreatCapitalModel = D("RetreatCapital");
$CapitalList = $RetreatCapitalModel->getSelect($where, $page, $limit, $fields);
if ($CapitalList) {
$count = $RetreatCapitalModel->getCount($where);
foreach ($CapitalList as $key => &$val) {
$val['index'] = $key + 1;
$val['collect_money'] = round($val['collect_money'], 2);
$val['collect_time'] = date('Y-m-d H:i:s', $val['collect_time']);
$val['add_time'] = date('Y-m-d H:i:s', $val['add_time']);
$val['operator_name'] = $this->OperatorName($val['operator_id']);
$val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name");
switch ($val[$RetreatCapitalModel::PAY_TYPE]) {
case 2:
$val['pay_name'] = "微信";
break;
case 3:
$val['pay_name'] = "支付宝";
break;
case 4:
$val['pay_name'] = "线下";
break;
case 5:
$val['pay_name'] = "银行卡";
break;
}
}
}
$CapitalList = $CapitalList ? $CapitalList : array();
$count = $count ? $count : 0;
$res = array(
'status' => 1,
'msg' => "查询成功",
'data' => $CapitalList,
'count' => $count
);
return $res;
}
/**
* 商户报损提交操作
* @param $param
* [
* merchant_id
* operator_id
* remarks 备注
* goodsList 商品信息
* ]
* @return mixed
*/
public function MerReportSub($param)
{
$verifyResult = $this->MerReportSubVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$merchant_id = $param['merchant_id'];
$goodsList = $param['goodsList'];
$warehouse_id = $verifyResult['data']; //仓库id
$time = $_SERVER['REQUEST_TIME'];
$data = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'remarks' => $param['remarks'],
'add_time' => $time,
'operator_id' => $param['operator_id']
];
try {
M()->startTrans();
$LossReportOrderModel = new LossReportOrderModel();
$LossOrder = $LossReportOrderModel->addData($data);
if ($LossOrder['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '订单创建失败'];
}
$LossOrderId = $LossOrder['data'];
$LossOrderNumber = "MB" . orderNumber($LossOrderId);
$moneyTotal = 0;
$LossReportGoods = new LossReportGoodsModel();
$SaleMGoodsModel = new SaleMGoodsModel();
$SerialClass = new SerialNumberGoods();
foreach ($goodsList as $key => &$val) {
$content = [
'merchant_id' => $merchant_id,
'warehouse_id' => $warehouse_id,
'loss_order_id' => $LossOrderId,
'loss_order_number' => $LossOrderNumber,
'add_time' => $time,
'goods_class_id' => $val['goods_class_id'],
'goods_id' => $val['goods_id'],
'goods_name' => $val['goods_name'],
'sku_name' => $val['sku_name'],
'goods_number' => $val['goods_number'],
'sku_goods_number' => $val['sku_goods_number'],
'goods_code' => $val['goods_code'],
'company' => $val['company'],
'attribute_state' => $val['attribute_state'],
'pricing_method' => $val['pricing_method'],
'loss_price' => $val['cost_price'],
'loss_num' => $val['loss_num'],
'subtotal' => round($val['cost_price'] * $val['loss_num'] * 1, 2),
'remarks' => $val['remarks'],
'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0
];
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
$content['sku_id_list'] = $val['sku_id_list'];
}
$success = $LossReportGoods->addData($content);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '报损失败'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
$serialResult = $SerialClass->lossSerial([
'user_type' => 3,
'merchant_id' => $merchant_id,
'outside_id' => $success['data'],
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'],
'add_time' => $time,
'serial_list' => $val['serial_list'],
]);
if ($serialResult['status'] != 1) {
M()->rollback();
return ['status' => 0, 'msg' => $serialResult['message']];
}
}
$where = [
'merchant_id' => $merchant_id,
'goods_id' => $val['goods_id'],
];
if ($val['attribute_state'] == 2) {
$where['sku_id'] = $val['sku_id'];
}
$goods_total_num = $SaleMGoodsModel->getFindField($where, "goods_num");
$SaleMGoodsModel->updateSetDec($where, "goods_num", $val['loss_num']);
//商户库存减少
if ($goods_total_num > 0) {
$ware_arr = [
'merchant_id' => $merchant_id,
'goods_id' => $val['goods_id'],
'surplus_num' => ['gt', 0],
];
if ($val['attribute_state'] == 2) {
$ware_arr['sku_id'] = $val['sku_id'];
}
$this->MerWarehouseReduce($ware_arr, $val['loss_num']);
//串号信息处理
if ($val['serial_number_state'] == 1) {
$serial_id_arr = array_column($val['serial_list'], 'id');
$SerialClass->warehouseSerialDec([
'user_type' => 3,
'serial_id_arr' => $serial_id_arr,
'type' => 1,
'merchant_id' => $merchant_id,
]);
}
}
$moneyTotal += $content['subtotal'];
}
$text['money_total'] = $moneyTotal;
$text['goods_species'] = count($goodsList);
$text['status'] = 1;
$text['order_number'] = $LossOrderNumber;
$success = $LossReportOrderModel->updateData(array('id' => $LossOrderId), $text);
if ($success['status'] == 0) {
M()->rollback();
return ['status' => 0, 'msg' => '操作失败'];
} else {
M()->commit();
return ['status' => 1, 'msg' => '操作成功'];
}
} catch (\Exception $e) {
return ['status' => 0, 'msg' => '操作失败'];
}
}
/**
* 商户报损提交验证
* @param $param
* [
* merchant_id
* operator_id
* remarks 备注
* goodsList 商品信息
* ]
* @return mixed
*/
public function MerReportSubVerify(&$param)
{
$reg1 = "/^[0-9]+(.[0-9]{1,2})?$/";
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
$goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true);
$SaleWarehouseModel = new SaleWarehouseModel();
$warehouse_id = $SaleWarehouseModel->getFindField(array('merchant_id' => $param['merchant_id'], 'status' => 1), "id"); //销售仓库
if (empty($warehouse_id)) {
return ['status' => 0, 'msg' => '请先创建供给仓'];
}
if (empty($goodsList) || empty($param['merchant_id']) || empty($param['operator_id'])) {
return ['status' => 0, 'msg' => '参数缺失'];
}
if (count($goodsList) > 500) {
return ['status' => 0, 'msg' => '单次操作上限为500种商品'];
}
foreach ($goodsList as $key => &$val) {
if (!$val['cost_price']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '成本价有误'];
}
if (!preg_match($reg1, $val['cost_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['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
} else {
if (!preg_match($reg2, $val['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量'];
}
}
} else if ($val['attribute_state'] == 2) {
if (!preg_match($reg3, $val['loss_num'])) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量'];
}
}
if ($val['loss_num'] > $val['goods_num']) {
return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '报损数量不能大于辅助数量'];
}
//串号信息
if ($val['serial_number_state'] == 1) {
if (empty($val['serial_list']) || count($val['serial_list']) != $val['loss_num']) {
return ['status' => 0, 'msg' => '请选择报损的串号信息'];
}
}
}
$param['goodsList'] = $goodsList;
return callBack(statusCode()['success'], '验证成功', $warehouse_id);
}
/**
* 报损详情
*/
public function MerReportDetails()
{
$id = I("post.id");
$where['loss_order_id'] = $id;
$detailsList = D('LossReportGoods')->getSelect($where, $page = '', $limit = '');
if ($detailsList) {
foreach ($detailsList as $key => &$val) {
$val['index'] = $key + 1;
$val['loss_num'] = round($val['loss_num'], 3);
$val['loss_price'] = round($val['loss_price'], 2);
$val['subtotal'] = round($val['subtotal'], 2);
$val['sku_num'] = round($val['sku_num'], 3);
if ($val['attribute_state'] == 2) {
$val['goods_code'] = $val['sku_code'];
$val['goods_number'] = $val['sku_goods_number'];
}
}
}
$res['data'] = $detailsList;
$res['status'] = 1;
return $res;
}
/*
* 提交申请
*/
public function ApplyOperation($data)
{
$reg2 = "/^[0-9]+(.[0-9]{1,3})?$/";
$reg3 = "/^\+?[1-9][0-9]*$/";
$merchant_id = $data['merchant_id'];
$store_id = $data['store_id'];
$time = $_SERVER['REQUEST_TIME'];
$goodsList = $data['goodsList'];
if (!$merchant_id || !$store_id || !$goodsList) {
$res['status'] = 0;
$res['msg'] = '缺少参数';
return $res;
}
$remarks = $data['remarks'];
if (count($goodsList) > 500) {
$res['status'] = 0;
$res['msg'] = '单次操作上限为500种';
return $res;
}
foreach ($goodsList as $key => &$val) {
if (!$val['apply_num']) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
return $res;
}
if ($val['attribute_state'] == 1 && $val['pricing_method'] == 2) {
if (!preg_match($reg2, $val['apply_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
return $res;
}
} else {
if (!preg_match($reg3, $val['apply_num'])) {
$res['status'] = 0;
$res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量";
return $res;
}
}
}
$order = array();
$order['store_id'] = $store_id;
$order['merchant_id'] = $merchant_id;
$order['add_time'] = $time;
$order['status'] = 1;
$order['remarks'] = $remarks;
$OperatorInfo = A('Api/Inventory')->Operator(session("jurisdiction_user"));
if ($OperatorInfo) {
$order['s_operator_id'] = $OperatorInfo['id'];
}
$res = D('AllocationOrder')->addData($order);
if ($res['status'] == 0) {
$res['msg'] = "订单创建失败";
return $res;
}
$orderId = $res['data'];
$orderNumber = 'SS' . orderNumber($orderId);
foreach ($goodsList as $key => &$val) {
$content = [];
$content['store_id'] = $store_id;
$content['merchant_id'] = $merchant_id;
$content['allocation_id'] = $orderId;
$content['order_number'] = $orderNumber;
$content['add_time'] = $time;
$content['goods_id'] = $val['goods_id'];
$content['goods_name'] = $val['goods_name'];
$content['goods_class_id'] = $val['goods_class_id'];
$content['goods_number'] = $val['goods_number'];
$content['goods_code'] = $val['goods_code'];
$content['company'] = $val['company'];
$content['attribute_state'] = $val['attribute_state'];
$content['pricing_method'] = $val['pricing_method'];
$content['apply_num'] = $val['apply_num'];
$content['remarks'] = $val['remarks'];
$content['serial_number_state'] = $val['serial_number_state'] ? $val['serial_number_state'] : 0;
if ($val['attribute_state'] == 2) {
$content['sku_id'] = $val['sku_id'];
$content['sku_name'] = $val['sku_name'];
$content['sku_id_list'] = $val['sku_id_list'];
$content['sku_goods_number'] = $val['sku_goods_number'];
$content['sku_code'] = $val['sku_code'];
$content['sku_num'] = $val['sku_num'];
}
$res = D('AllocationGoods')->addData($content);
if ($res['status'] == 0) {
$res['msg'] = '商品存入失败';
return $res;
}
}
$text = array();
$text['store_goods_species'] = count($goodsList);
$text['order_number'] = $orderNumber;
$res = D('AllocationOrder')->updateData(array('id' => $orderId), $text);
if ($res['status'] == 0) {
$res['msg'] = '订单修改失败';
return $res;
}
return $res;
}
}