GroupOrder.php 8.56 KB
<?php
defined('IN_IA') or exit('Access Denied');
require_once IA_ROOT . '/addons/zh_cjdianc/inc/class/Group.php';
require_once IA_ROOT . '/addons/zh_cjdianc/inc/func/Http.php';
require_once IA_ROOT . '/addons/zh_cjdianc/inc/config.php';
require_once IA_ROOT . '/addons/zh_cjdianc/inc/class/Order.php';
class GroupOrder
{
	const ORDER_STATUS_WAIT_PAY 		= 1; //未付款,
	const ORDER_STATUS_HAS_PAY			= 2; //已付款
	const ORDER_STATUS_FINISHED			= 3;//.已完成
	const ORDER_STATUS_CLOSED			= 4;//.已关闭
	const ORDER_STATUS_INVALID			= 5;//.已失效

	/**
	 * 订单号
	 * @return string
	 */
	static function genOrderNum()
	{
		return date('YmdHis', time()) . rand(1111, 9999); //订单号
	}

	/*
	 * 支付用的code
	 */
	static function payCode($userId)
	{
		return "G".time() . rand(1000, 9999) . $userId;
	}

	/**
	 * 处理支付之后的问题
	 * @param $out_trade_no
	 */
	static function afterOrderPay($out_trade_no, $postData)
	{
		$groupOrder = pdo_get('cjdc_grouporder', array('code'=> $out_trade_no));
		if (empty($groupOrder)) {
			return false;
		}
		// checkPostData 校验数据是否正确 sign

		//
		$tt = time();
		if ($groupOrder && self::ORDER_STATUS_WAIT_PAY == $groupOrder['state']) {
			$updateFields = ['state'=> self::ORDER_STATUS_HAS_PAY, 'pay_time' => $tt, 'wx_notify_data' => json_encode($postData, JSON_UNESCAPED_UNICODE)];
			pdo_update('cjdc_grouporder', $updateFields, array('id' => $groupOrder['id']));

			if (empty($groupOrder['group_id'])) {
				return '';
			}
			$groupId = $groupOrder['group_id'];
			$count = pdo_get('cjdc_grouporder', array('group_id' => $groupId, 'state '=> self::ORDER_STATUS_HAS_PAY ), array('count(user_id) as count'));
			$group = pdo_get('cjdc_group', array('id' => $groupId));
			if ($group['kt_num'] == $count['count']) {
				$state = Group::STATUS_SUCCESS;
				$callHeadURL = "https://".$_SERVER['HTTP_HOST'] . "/app/index.php?i=".$groupOrder['uniacid']."&c=entry&a=wxapp";

				$sign = Config::genSign(['uniacid' => $groupOrder['uniacid'], 'group_id' => $groupId, 'timeStamp' => $tt]);
				Http::httpGet("{$callHeadURL}&do=SendOrdersToStore&m=zh_cjdianc&group_id={$groupId}&sign={$sign}&timeStamp={$tt}"); //把订单自动派发给门店
				Http::httpGet("{$callHeadURL}&do=GroupPrint&m=zh_cjdianc&group_id={$groupId}&sign={$sign}&timeStamp={$tt}");		 //拼团打印
				Http::httpGet("{$callHeadURL}&do=GroupMessage&m=zh_cjdianc&group_id={$groupId}&sign={$sign}&timeStamp={$tt}");	 	//拼团模板消息
			} else {
				$state = Group::STATUS_GROUPING;
			}
			//改变团状态
			pdo_update('cjdc_group', array('state' => $state, 'yg_num +=' => 1), array('id' => $groupOrder['group_id']));

			return true;
		}
		return false;
	}

	/**
	 * 派送拼团订单给门店
	 * @param $group
	 * @return array
	 */
	static function dispatchOrderToStore($group)
	{
		$e = [
			'success' => false,
			'message' => ''
		];
		if (empty($group)) {
			$e['message'] = '无拼团';
			return $e;
		}

		$groupOrders = pdo_getall('cjdc_grouporder', ['group_id' => $group['id'], 'state' => self::ORDER_STATUS_HAS_PAY]);
		if (empty($groupOrders)) {
			$e['message'] = '无订单!';
			return $e;
		}

		foreach($groupOrders as $k => $groupOrder) {
			if (empty($groupOrder['dispatch_order_id'])) {
				continue;
			}

			$postData = json_decode($groupOrder['submit_data'], true);

			if (empty($postData)) {
				$e['message'] = 'dispatchOrder出错';
				return $e;
			}
			$postData["type"] = Order::TYPE_GROUP;
			$postData['pay_time'] = date('Y-m-d H:i:s');
			$postData["state"] = Order::ORDER_STATUS_FINISHING;
			unset($postData["isAdd"]);
			unset($postData["groupId"]);
			unset($postData["gType"]);

			$res = pdo_insert('cjdc_order', $postData);
			$orderId = pdo_insertid();
			if (!$res) {
				continue;
			}
			pdo_update('cjdc_grouporder', ['dispatch_order_id' => $orderId], ['id' => $groupOrder['id']]);


			$orderGoodsArr = pdo_getall('cjdc_group_order_goods', ['order_id' => $groupOrder['id']]);
			$goodsTotalPrice = 0;
			foreach ($orderGoodsArr as $kk => $orderGoods) {
				$data2['name']		= $orderGoods['name']; //商品名称
				$data2['number']	= $orderGoods['num']; //商品数量
				$data2['money'] 	= $orderGoods['union_price']; //商品单价
				$data2['img'] 		= $orderGoods['img']; //商品图片
				$data2['spec'] 		= $orderGoods['spec']; //商品规格
				$data2['dishes_id'] = $orderGoods['goods_id']; //商品id
				$data2['is_qg'] 	= 2; //不是抢购商品
				$data2['uniacid'] 	= $orderGoods['uniacid']; //小程序id
				$data2['order_id'] 	= $orderId;
				$goodsTotalPrice = $goodsTotalPrice*1 + ($orderGoods['num']* $orderGoods['union_price']);
				$res2 = pdo_insert('cjdc_order_goods', $data2);
			}
			$financeData = ['pay_price' => $postData['money'], 'store_id' => $postData['store_id'], 'order_id' => $orderId,'order_type' => Order::TYPE_GROUP , 'goods_price' => $goodsTotalPrice ,'refund_price' => 0];
			Finance::addOrderPriceStat($financeData);
		}

		$e['success'] = true;
		return $e;
	}

	/**
	 * @param $_GPC
	 * @param $_W
	 * @param $data
	 * @param $submitGoodsInfo
	 * @return mixed
	 */
	static function placeGroupOrder($_GPC, $_W, $data, $submitGoodsInfo)
	{
		$tt = time();
		$groupMemberNum = Group::G_2_NUM;
		// 防止恶意改变 主团人数,初始化只能 2 3
		if (Group::G_3_NUM == $data['gType']) {
			$groupMemberNum = Group::G_3_NUM;
		}
		$submitGoods = $submitGoodsInfo[0];
		$goodsPrice = $submitGoodsInfo[1];
		$expireTime = Group::expireTime($_GPC['dq_time']);
		$group = null;
		$insertResult = null;
		if ($data['isAdd']) {
			if (empty($data['groupId'])) {
				$data2['store_id']  = $data['store_id'];
				$data2['kt_num'] 	= $groupMemberNum;  //开团人数
				$data2['yg_num'] 	= 0;			//购买人数为1
				$data2['kt_time'] 	= $tt;			// 开团时间
				$data2['dq_time'] 	= $expireTime; // 到期时间 expire_time 暂时这么处理,稍后调整
				$data2['state'] 	= Group::STATUS_START;
				$data2['user_id'] 	= $_GPC['user_id'];
				$data2['uniacid'] 	= $_W['uniacid'];
				$insertResult = pdo_insert('cjdc_group', $data2);
				$data['groupId'] = pdo_insertid();
				if (empty($insertResult) ) {
					$e['message'] = '下单失败';
					return $e;
				}
			}
		}

		$group = pdo_get('cjdc_group', array('id' => $data['groupId']));
		if (empty($group)) {
			$e['message'] = '找不到该团';
			return $e;
		}
		if (empty($data['isAdd']) && $group['user_id'] == $_GPC['user_id']) {
			$e['message'] = '你已经开团了,请不要重复开团';
			$e['code']	= 'HAS_OPEN';
			return $e;
		}

		$saveData['order_num'] 		= self::genOrderNum(); //订单号
		$saveData['user_id'] 		= $_GPC['user_id'];
		$saveData['group_id'] 		= $data['groupId'];
		//$saveData['logo'] 			= $_GPC['logo'];
		$saveData['store_id'] 		= $data['store_id'];
		$saveData['total_price'] 	= $goodsPrice + $data['box_money']*1 +  $data['ps_money'] *1;
		$saveData['pay_price'] 		= $data['money'];
		$saveData['receive_name'] 	= $data['name'];
		$saveData['receive_tel'] 	= $data['tel'];
		$saveData['receive_address'] = $data['address'];
		$saveData['note'] 			= $data['note'];
		$saveData['time'] 			= $tt;
		$saveData['code'] 			= self::payCode($_GPC['user_id']);
		$saveData['xf_time'] 		= $expireTime;
		$saveData['uniacid'] 		= $_W['uniacid'];
		$saveData['pay_type'] 		= $data['pay_type'];
		$saveData['state'] 			= self::ORDER_STATUS_WAIT_PAY;
		$saveData['submit_data']	= json_encode($data, JSON_UNESCAPED_UNICODE);
		$groupOrderRes = pdo_insert('cjdc_grouporder', $saveData);
		$groupOrderId  = pdo_insertid();
		if (empty($groupOrderRes)) {
			$e['message'] = '提交订单失败';
			return $e;
		}

		// 保存商品
		if ($submitGoods && $groupOrderRes) {
			foreach ($submitGoods as $k => $goods) {
				$goodData = [
						'store_id' 		=> $data['store_id'],
						'order_id' 		=> $groupOrderId,
						'goods_id' 		=> $goods['dishes_id'],
						'name'  		=> $goods['name'],
						'logo'  		=> $goods['img'],
						'img'  			=> $goods['img'],
						'union_price'	=> $goods['money'],
						'num'			=> $goods['number'],
						'spec'			=> $goods['spec'],
						'uniacid'		=> $goods['uniacid'],
						'created_at' 	=> $tt
				];
				pdo_insert('cjdc_group_order_goods', $goodData);
			}
		}

		if ($_GPC['coupon_id']) {
			pdo_update('cjdc_usercoupons', array('state' => 1),  array('id' => $_GPC['coupon_id']));
		}
		if ($_GPC['coupon_id2']) {
			pdo_update('cjdc_usercoupons', array('state' => 1),  array('id' => $_GPC['coupon_id2']));
		}

		pdo_delete('cjdc_shopcar', array('user_id' => $_GPC['user_id'], 'store_id' => $_GPC['store_id'], 'type' => 1));

		$e['success'] = true;
		$e['message'] = 'ok';
		$e['groupId'] = $data['groupId'];
		$e['orderId'] = $groupOrderId;

		return $groupOrderId;
	}
}