7955 行
343 KiB
PHP
可执行文件
7955 行
343 KiB
PHP
可执行文件
<?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;
|
||
}
|
||
} |