474 行
18 KiB
PHP
可执行文件
474 行
18 KiB
PHP
可执行文件
<?php
|
|
|
|
namespace CashierApi\Business;
|
|
|
|
use Common\Model\RetailBillDiscountModel;
|
|
use Common\Model\RetailBillOrderModel;
|
|
use Common\Model\RetailGoodsGiftsModel;
|
|
use Common\Model\RetailGoodsModel;
|
|
use Common\Model\RetailPayOrderModel;
|
|
use Common\Model\RetailSellModel;
|
|
use Common\Model\SPurchasePayableModel;
|
|
use Common\Model\SSaleMGoodsModel;
|
|
|
|
//[1.8.74]
|
|
|
|
/**
|
|
* 离线收银类
|
|
* Class OfflineCashier
|
|
* [
|
|
* 离线收银 offlineCollection
|
|
* 创建支付流水记录 createPayOrder
|
|
* 商品信息记录 createSell
|
|
* 库存操作 InventoryOperation
|
|
* 创建折扣记录 createDisCount
|
|
* 创建订单 createBillOrder
|
|
* 离线收银参数验证 paramVerify
|
|
* 修改订单状态 failOrder
|
|
* ]
|
|
* @package CashierApi\Business
|
|
*/
|
|
class OffLineCashier
|
|
{
|
|
/**
|
|
* 离线收银
|
|
* @param $param
|
|
* [
|
|
* operator_type 1后台 2收银端 3助手端
|
|
* merchant_id
|
|
* store_id
|
|
* cashier_id
|
|
* supplier_type 1常规供货商 2寄售供货商
|
|
* order_info =>[ json字符串
|
|
* local_id 本地库id
|
|
* goodsList 商品信息
|
|
* all_money 前台计算的总金额
|
|
* amount_received 实收金额
|
|
* pay_money 订单金额
|
|
* business_remark 订单备注
|
|
* changes_money 抹零金额
|
|
* discount 收银员手动打折折扣值
|
|
* cashier_dis_money 手动打折优惠金额。
|
|
* cashier_manual_money 收银员手动单品打折优惠金额
|
|
* order_number 订单编号
|
|
* other_pay_id 其他支付id
|
|
* pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账
|
|
* add_time 下单时间
|
|
* ]
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function offlineCollection($param)
|
|
{
|
|
$verifyResult = $this->paramVerify($param); //参数验证
|
|
if ($verifyResult['status'] != 1) {
|
|
return $verifyResult;
|
|
}
|
|
try {
|
|
$orderResult = $this->createBillOrder($param); //创建订单
|
|
if ($orderResult['status'] != 1) {
|
|
return $orderResult;
|
|
}
|
|
$disCountResult = $this->createDisCount($param); //折扣记录
|
|
if ($disCountResult['status'] != 1) {
|
|
return $disCountResult;
|
|
}
|
|
$SellResult = $this->createSell($param); //商品记录保存
|
|
if ($SellResult['status'] != 1) {
|
|
return $SellResult;
|
|
}
|
|
$PayResult = $this->createPayOrder($param); //创建支付流水记录
|
|
if ($PayResult['status'] != 1) {
|
|
return $PayResult;
|
|
}
|
|
return callBack(statusCode()['success'], "订单完成");
|
|
} catch (\Exception $e) {
|
|
$this->failOrder($param['bill_order_id']);
|
|
return callBack(statusCode()['error'], "订单上传失败", $param['order_info']['local_id']);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 创建支付流水记录
|
|
* @param $param
|
|
* [
|
|
* merchant_id
|
|
* store_id
|
|
* cashier_id
|
|
* order_info =>[
|
|
* local_id 本地数据库id
|
|
* bill_order_id 订单id
|
|
* pay_money 订单金额
|
|
* other_pay_id 其他支付id
|
|
* pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账
|
|
* add_time 下单时间
|
|
* ]
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function createPayOrder($param)
|
|
{
|
|
$order_info = $param['order_info']; //订单信息
|
|
$pay_arr = [
|
|
'order_type' => 1,
|
|
'scene_type' => 1,
|
|
'pay_type' => $order_info['pay_type'],
|
|
'trade_amount' => $order_info['pay_money'],
|
|
'store_id' => $param['store_id'],
|
|
'merchant_id' => $param['merchant_id'],
|
|
'cashier_id' => $param['cashier_id'],
|
|
'add_time' => $order_info['add_time'],
|
|
'trade_date' => $order_info['add_time'],
|
|
'bill_id' => $order_info['bill_order_id'],
|
|
'other_pay_id' => $order_info['other_pay_id'],
|
|
'order_state' => 'SUCCESS',
|
|
];
|
|
$PayOrder = new RetailPayOrderModel();
|
|
$pay_id = $PayOrder->addPayOrder($pay_arr);
|
|
if (empty($pay_id)) {
|
|
$this->failOrder($param['bill_order_id']);
|
|
return callBack(statusCode()['error'], "支付记录保存失败", $order_info['local_id']);
|
|
}
|
|
return callBack(statusCode()['success'], "支付流水记录创建成功");
|
|
}
|
|
|
|
|
|
/**
|
|
* 商品信息记录
|
|
* @param $param
|
|
* [
|
|
* merchant_id
|
|
* store_id
|
|
* cashier_id
|
|
* supplier_type 1常规供货商 2寄售供货商
|
|
* bill_order_id 订单id
|
|
* order_info => 订单信息[
|
|
*
|
|
* goodsList 商品信息=>[
|
|
*
|
|
* ]
|
|
* bill_order_id 订单id
|
|
* local_id 本地数据库id
|
|
* add_time 下单时间
|
|
* pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function createSell($param)
|
|
{
|
|
$GoodsGiftsModel = new RetailGoodsGiftsModel();
|
|
$store_id = $param['store_id'];
|
|
$supplier_type = $param['supplier_type'];
|
|
$order_info = $param['order_info']; //订单信息
|
|
$goodsList = $param['order_info']['goodsList']; //商品信息
|
|
$SPurchasePayableModel = new SPurchasePayableModel();
|
|
$sell_arr_all = [];
|
|
$sell_arr = [
|
|
'bill_id' => $order_info['bill_order_id'],
|
|
'pay_type' => $order_info['pay_type'] == 3 ? 1 : 7,
|
|
'add_time' => $order_info['add_time'],
|
|
'store_id' => $param['store_id'],
|
|
'merchant_id' => $param['merchant_id'],
|
|
'cashier_id' => $param['cashier_id'],
|
|
'type' => 2,
|
|
'sell_type' => 1,
|
|
'pay_state' => 1
|
|
];
|
|
|
|
foreach ($goodsList as $value) {
|
|
$sell_arr['goods_class_id'] = $value['goods_class_id'] ? $value['goods_class_id'] : 0;
|
|
$sell_arr['goods_type'] = $value['goods_type'];
|
|
$sell_arr['pricing_method'] = $value['pricing_method'];
|
|
$sell_arr['attribute_state'] = $value['attribute_state'];
|
|
$sell_arr['goods_img_id'] = $value['goods_img_id'];
|
|
$sell_arr['company'] = $value['company'];
|
|
$sell_arr['cashier_manual_discount'] = $value['cashier_manual_discount'] ? $value['cashier_manual_discount'] : 1;
|
|
$sell_arr['cashier_dis_money'] = $value['cashier_dis_money'] ? $value['cashier_dis_money'] : 0;
|
|
$sell_arr['small_changes_money'] = $value['small_changes_money'] ? $value['small_changes_money'] : 0;
|
|
$sell_arr['cashier_manual_discount_money'] = $value['cashier_manual_discount_money'] ? $value['cashier_manual_discount_money'] : 0;
|
|
$sell_arr['num'] = $value['num'];
|
|
$sell_arr['sell_number'] = $value['num'];
|
|
$sell_arr['goods_name'] = $value['goods_name'];
|
|
$sell_arr['code_price_state'] = $value['code_price_state'] ? $value['code_price_state'] : 0;
|
|
if ($value['goods_type'] == 2) {
|
|
if (empty($value['goods_name'])) {
|
|
$sell_arr['goods_name'] = '无码商品';
|
|
}
|
|
$sell_arr['goods_id'] = 0;
|
|
$sell_arr['purchase_price'] = $value['retail_price'];
|
|
} else {
|
|
$sell_arr['goods_id'] = $value['id'];
|
|
$sell_arr['purchase_price'] = $value['purchase_price'];
|
|
}
|
|
if (!empty($value['goods_gifts_id'])) {
|
|
//赠品
|
|
$sell_arr['original_price'] = 0;
|
|
$sell_arr['all_money'] = 0;
|
|
$sell_arr['price'] = 0;
|
|
$sell_arr['goods_gifts_type'] = 0;
|
|
$GoodsGiftsModel->toSetDec(['id' => $value['goods_gifts_id']], 'remain_inventory', $value['num']);
|
|
} else {
|
|
$sell_arr['original_price'] = $value['code_price_state'] == 1 ? (round($value['all_money'] / $value['num'], 2)) : $value['retail_price'];
|
|
$sell_arr['price'] = $value['price'] ? $value['price'] : 0;
|
|
$sell_arr['all_money'] = $value['all_money'];
|
|
$sell_arr['goods_gifts_type'] = null;
|
|
}
|
|
if (!empty($value['sku'])) {
|
|
$sku_info = [
|
|
'id' => $value['sku'][0]['id'],
|
|
'goods_id' => $value['id'],
|
|
'sku_id_list' => $value['sku'][0]['sku_id_list'],
|
|
'name' => $value['sku'][0]['name']
|
|
];
|
|
$sell_arr['sku_id'] = $sku_info['id'];
|
|
$sell_arr['sku_json_info'] = json_encode($sku_info);
|
|
} else {
|
|
$sell_arr['sku_id'] = 0;
|
|
$sell_arr['sku_json_info'] = null;
|
|
}
|
|
if ($value['goods_type'] == 1) {
|
|
$stockResult = $this->InventoryOperation([
|
|
'goods_id' => $value['id'],
|
|
'sku_id' => $value['sku'][0]['id'],
|
|
'num' => $value['num'],
|
|
'all_money' => $sell_arr['all_money'],
|
|
'original_price' => $sell_arr['original_price'],
|
|
'goods_gifts_type' => $sell_arr['goods_gifts_type']
|
|
]);
|
|
if ($stockResult['status'] == 1 && !empty($stockResult['info']) && $supplier_type == 2 && !empty($stockResult['info']['supplier_json']) && !empty($stockResult['info']['purchase_id_str'])) {
|
|
//寄售供货商
|
|
$stock_arr = [
|
|
'supplier_json' => $stockResult['info']['supplier_json'],
|
|
'purchase_id_str' => $stockResult['info']['purchase_id_str'],
|
|
'store_id' => $store_id
|
|
];
|
|
$SPurchasePayableModel->addPayableMoney($stock_arr);
|
|
$sell_arr['supplier_json'] = json_encode($stockResult['info']['supplier_json']);
|
|
$sell_arr['purchase_id_str'] = $stockResult['info']['purchase_id_str'];
|
|
}
|
|
}
|
|
$sell_arr_all[] = $sell_arr;
|
|
if ($supplier_type == 2) {
|
|
unset($sell_arr['supplier_json']);
|
|
unset($sell_arr['purchase_id_str']);
|
|
}
|
|
}
|
|
if (!empty($sell_arr_all)) {
|
|
$SellModel = new RetailSellModel();
|
|
$sell_id = $SellModel->addAll($sell_arr_all);
|
|
if (empty($sell_id)) {
|
|
$this->failOrder($param['bill_order_id']);
|
|
return callBack(statusCode()['error'], "商品销售记录保存失败", $order_info['local_id']);
|
|
}
|
|
return callBack(statusCode()['success'], "商品购买记录保存成功");
|
|
} else {
|
|
return callBack(statusCode()['error'], "商品信息有误", $order_info['local_id']);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 库存操作
|
|
* @param $param
|
|
* [
|
|
* $goods_id, $sku_id, $num, $all_money, $original_price, $goods_gifts_type
|
|
* ]
|
|
* @return array
|
|
*/
|
|
public function InventoryOperation($param)
|
|
{
|
|
if ($param['goods_gifts_type'] === null) {
|
|
//非赠品的商品库存减少
|
|
$where = [];
|
|
if (!empty($param['sku_id'])) {
|
|
$where['sku_id'] = $param['sku_id'];
|
|
}
|
|
$where['goods_id'] = $param['goods_id'];
|
|
$SSaleMGoodsModel = new SSaleMGoodsModel();
|
|
$SSaleMGoodsModel->updateSetDec($where, "goods_num", $param['num']);
|
|
}
|
|
if ($param['goods_gifts_type'] !== null) {
|
|
//赠品
|
|
$stock_type = 16;
|
|
$param['original_price'] = 0;
|
|
} else {
|
|
//普通商品
|
|
$stock_type = 7;
|
|
}
|
|
$stock_data = [
|
|
'goods_id' => $param['goods_id'],
|
|
'sku_id' => $param['sku_id'],
|
|
'stock_price' => $param['original_price'],
|
|
'stock_num' => $param['num'],
|
|
'type' => $stock_type,
|
|
'all_money' => $param['all_money'],
|
|
];
|
|
$info = A('Api/Inventory')->goodsNumReduce($stock_data);
|
|
$GoodsModel = new RetailGoodsModel();
|
|
$map = [
|
|
'id' => $param['goods_id']
|
|
];
|
|
$success = $GoodsModel->toSetInc($map, "sell_num", $param['num']); // 商品销售数量
|
|
$res = [
|
|
'status' => 1,
|
|
'success' => $success,
|
|
'info' => $info['stock_arr'] ? $info['stock_arr'] : []
|
|
];
|
|
return $res;
|
|
}
|
|
|
|
|
|
/**
|
|
* 创建折扣记录
|
|
* @param $param
|
|
* [
|
|
* order_info =>[
|
|
* local_id 本地数据库id
|
|
* bill_order_id 订单id
|
|
* changes_money 抹零金额
|
|
* discount 收银员手动打折折扣值
|
|
* cashier_dis_money 手动打折优惠金额。
|
|
* cashier_manual_money 收银员手动单品打折优惠金额
|
|
* ]
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function createDisCount($param)
|
|
{
|
|
$order_info = $param['order_info']; //订单信息
|
|
$dis_arr = [
|
|
'bill_id' => $order_info['bill_order_id'],
|
|
'small_changes_money' => $order_info['changes_money'] ? $order_info['changes_money'] : 0,
|
|
'discount' => $order_info['discount'] ? $order_info['discount'] : 1,
|
|
'cashier_dis_money' => $order_info['cashier_dis_money'] ? $order_info['cashier_dis_money'] : 0,
|
|
'cashier_manual_money' => $order_info['cashier_manual_money'] ? $order_info['cashier_manual_money'] : 0,
|
|
];
|
|
$BillDiscountModel = new RetailBillDiscountModel();
|
|
$dis_id = $BillDiscountModel->addOrder($dis_arr);
|
|
if (empty($dis_id)) {
|
|
$this->failOrder($param['bill_order_id']);
|
|
return callBack(statusCode()['error'], "订单创建失败", $order_info['local_id']);
|
|
}
|
|
return callBack(statusCode()['success'], "创建折扣记录成功");
|
|
}
|
|
|
|
|
|
/**
|
|
* 创建订单
|
|
* @param $param
|
|
* merchant_id
|
|
* store_id
|
|
* cashier_id
|
|
* order_info =>[
|
|
* local_id 本地库id
|
|
* all_money 前台计算的总金额
|
|
* amount_received 实收金额
|
|
* pay_money 订单金额
|
|
* business_remark 订单备注
|
|
* order_number 订单编号
|
|
* pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账
|
|
* add_time 下单时间
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function createBillOrder(&$param)
|
|
{
|
|
$order_info = $param['order_info']; //订单信息
|
|
$order_arr = [
|
|
'store_id' => $param['store_id'],
|
|
'merchant_id' => $param['merchant_id'],
|
|
'cashier_id' => $param['cashier_id'],
|
|
'pay_state' => 1,
|
|
'type' => 2,
|
|
'pay_type' => $order_info['pay_type'] == 3 ? 1 : 7,
|
|
'add_time' => $order_info['add_time'],
|
|
'finish_time' => $order_info['add_time'],
|
|
'all_money' => $order_info['all_money'],
|
|
'amount_received' => $order_info['amount_received'],
|
|
'pay_money' => $order_info['pay_money'],
|
|
'give_change' => round($order_info['amount_received'] - $order_info['pay_money'], 2),
|
|
'business_remark' => $order_info['business_remark'],
|
|
'order_no' => $order_info['order_number'],
|
|
];
|
|
$BillOrderModel = new RetailBillOrderModel();
|
|
$bill_id = $BillOrderModel->addOrder($order_arr); //订单id
|
|
if (empty($bill_id)) {
|
|
return callBack(statusCode()['error'], "订单创建失败", $order_info['local_id']);
|
|
}
|
|
$BillOrderModel->create_print_number($bill_id, 2, $param['store_id']);
|
|
$param['order_info']['bill_order_id'] = $bill_id;
|
|
return callBack(statusCode()['success'], "订单创建成功");
|
|
}
|
|
|
|
|
|
/**
|
|
* 离线收银参数验证
|
|
* @param $param
|
|
* [
|
|
* operator_type 1后台 2收银端 3助手端
|
|
* merchant_id
|
|
* store_id
|
|
* cashier_id
|
|
* order_info =>[
|
|
* local_id 本地库id
|
|
* goodsList 商品信息
|
|
* all_money 前台计算的总金额
|
|
* amount_received 实收金额
|
|
* pay_money 订单金额
|
|
* order_number 订单编号
|
|
* pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账
|
|
* ]
|
|
* ]
|
|
* @return mixed
|
|
*/
|
|
public function paramVerify(&$param)
|
|
{
|
|
if ($param['operator_type'] != '2') {
|
|
return callBack(statusCode()['error'], "非法访问");
|
|
}
|
|
if (empty($param['merchant_id']) || empty($param['store_id']) || empty($param['cashier_id'])) {
|
|
return callBack(statusCode()['error'], "登录超时");
|
|
}
|
|
$order_info = json_decode(htmlspecialchars_decode($param['order_info']), true);
|
|
if (empty($order_info['local_id'])) {
|
|
return callBack(statusCode()['error'], "缺少本地id");
|
|
}
|
|
if (empty($order_info) || !is_array($order_info)) {
|
|
return callBack(statusCode()['error'], "暂无订单信息");
|
|
}
|
|
if (!in_array($order_info['pay_type'], ['3', '5'])) {
|
|
return callBack(statusCode()['error'], "支付方式有误", $order_info['local_id']);
|
|
}
|
|
if (empty($order_info['goodsList']) || !is_array($order_info['goodsList'])) {
|
|
return callBack(statusCode()['error'], "暂无商品信息", $order_info['local_id']);
|
|
}
|
|
if (
|
|
$order_info['all_money'] != round($order_info['all_money'], 2) ||
|
|
$order_info['amount_received'] != round($order_info['amount_received'], 2) ||
|
|
$order_info['pay_money'] != round($order_info['pay_money'], 2)
|
|
) {
|
|
return callBack(statusCode()['error'], "支付金额有误", $order_info['local_id']);
|
|
}
|
|
if (empty($order_info['order_number']) || substr($order_info['order_number'], 0, 1) != 'L') {
|
|
return callBack(statusCode()['error'], "订单号有误", $order_info['local_id']);
|
|
}
|
|
if (strpos($order_info['add_time'], '-') !== false) {
|
|
$order_info['add_time'] = strtotime($order_info['add_time']);
|
|
}
|
|
$param['order_info'] = $order_info;
|
|
return callBack(statusCode()['success'], "验证成功");
|
|
}
|
|
|
|
|
|
/**
|
|
* 修改订单状态
|
|
* @param $bill_id
|
|
*/
|
|
public function failOrder($bill_id)
|
|
{
|
|
$BillOrderModel = new RetailBillOrderModel();
|
|
$BillOrderModel->updateOrder(['id' => $bill_id], ['pay_state' => 0]);
|
|
}
|
|
}
|