[ 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]); } }