【类 型】:factor 锁定航线 和 处理 订单表 融合处理
【原 因】:采用事务处理 保证两表同步更新 【过 程】:用$rsDb->startTrans(); 把之前的lockSite 和 questAss函数 融合到一起 采用事务处理 【影 响】:
This commit is contained in:
parent
f1bb039101
commit
476c54f3b4
@ -156,61 +156,6 @@ class PlaneController extends PublicController
|
|||||||
echo json_encode(array('status' => 0, 'msg' => '暂无站点数据'));
|
echo json_encode(array('status' => 0, 'msg' => '暂无站点数据'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* @description: 飞机在站点上注册航线或注销航线
|
|
||||||
*/
|
|
||||||
public function lockSite()
|
|
||||||
{
|
|
||||||
//总管理员可接收任何shop_id,非总管理员只可以调用自身shop_id,否则会中断
|
|
||||||
$this->isPower();
|
|
||||||
|
|
||||||
if ($_REQUEST['id'] && $_REQUEST['shop_id']) {
|
|
||||||
$rsDb = D('receive_site');
|
|
||||||
$where['id'] = $_REQUEST['id'];
|
|
||||||
$where['shop_id'] = $_REQUEST['shop_id'];
|
|
||||||
|
|
||||||
// 检查站点是否绑定了航线
|
|
||||||
$rsCheck = $rsDb->where($where)->find();
|
|
||||||
if (!$rsCheck || $rsCheck['bind_route'] === null || $rsCheck['bind_route'] === '') {
|
|
||||||
exit(json_encode(array('status' => 0, 'msg' => '此站点未绑定航线!')));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取传入的 runing 字段,并按逗号分割成数组,过滤掉空字符串和 null
|
|
||||||
$submittedRuning = $_REQUEST['runing'] ?? '';
|
|
||||||
$submittedRuningArray = array_filter(explode(',', $submittedRuning), function ($value) {
|
|
||||||
return trim($value) !== '';
|
|
||||||
});
|
|
||||||
|
|
||||||
// 构建查询条件,排除当前站点并且 id 不等于当前 id 的记录
|
|
||||||
$whereAll['shop_id'] = $_REQUEST['shop_id'];
|
|
||||||
$whereAll['id'] = array('neq', $_REQUEST['id']);
|
|
||||||
|
|
||||||
// 查询数据库中符合条件的所有记录
|
|
||||||
$otherRecords = $rsDb->where($whereAll)->select();
|
|
||||||
foreach ($otherRecords as $record) {
|
|
||||||
$existingRuning = $record['runing'] ?? '';
|
|
||||||
$existingRuningArray = array_filter(explode(',', $existingRuning), function ($value) {
|
|
||||||
return trim($value) !== '';
|
|
||||||
});
|
|
||||||
|
|
||||||
// 检查两个数组是否有重复元素
|
|
||||||
$intersection = array_intersect($submittedRuningArray, $existingRuningArray);
|
|
||||||
if (!empty($intersection)) {
|
|
||||||
exit(json_encode(array('status' => 0, 'msg' => '提交的航线与其他站点重复!')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果 $_REQUEST['runing'] 为空字符串 或者null,将其设置为 null
|
|
||||||
$data['runing'] = trim($_REQUEST['runing']) === '' ? null : trim($_REQUEST['runing']);
|
|
||||||
if ($rsDb->where($where)->save($data)) {
|
|
||||||
exit(json_encode(array('status' => 1, 'msg' => '站点航线执行操作成功!')));
|
|
||||||
} else {
|
|
||||||
exit(json_encode(array('status' => 0, 'msg' => '站点航线执行操作失败!')));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
exit(json_encode(array('status' => 0, 'msg' => '参数有误')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* @description: 创建新站点
|
* @description: 创建新站点
|
||||||
*/
|
*/
|
||||||
@ -573,6 +518,107 @@ class PlaneController extends PublicController
|
|||||||
echo json_encode(array('status' => 0, 'msg' => '删除失败'));
|
echo json_encode(array('status' => 0, 'msg' => '删除失败'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @description: 飞机在站点上注册航线或注销航线 并处理对应的订单 ps:用处理事务 保证两表同步
|
||||||
|
*/
|
||||||
|
public function lockSite()
|
||||||
|
{
|
||||||
|
//总管理员可接收任何shop_id,非总管理员只可以调用自身shop_id,否则会中断
|
||||||
|
$this->isPower();
|
||||||
|
|
||||||
|
if ($_REQUEST['site_id'] && $_REQUEST['order_id'] && $_REQUEST['shop_id']) {
|
||||||
|
// 公用条件
|
||||||
|
$where['shop_id'] = $_REQUEST['shop_id'];
|
||||||
|
// 获取模型
|
||||||
|
$rsDb = D('receive_site');
|
||||||
|
$orderDb = D('order');
|
||||||
|
// 启动事务
|
||||||
|
$rsDb->startTrans();
|
||||||
|
|
||||||
|
try {
|
||||||
|
/*航线表操作*/
|
||||||
|
$where['id'] = $_REQUEST['site_id'];
|
||||||
|
|
||||||
|
// 检查站点是否绑定了航线
|
||||||
|
$rsCheck = $rsDb->where($where)->find();
|
||||||
|
if (!$rsCheck || $rsCheck['bind_route'] === null || $rsCheck['bind_route'] === '') {
|
||||||
|
throw new Exception('此站点未绑定航线!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取传入的 runing 字段,并按逗号分割成数组,过滤掉空字符串和 null
|
||||||
|
$submittedRuning = $_REQUEST['runing'] ?? '';
|
||||||
|
$submittedRuningArray = array_filter(explode(',', $submittedRuning), function ($value) {
|
||||||
|
return trim($value) !== '';
|
||||||
|
});
|
||||||
|
|
||||||
|
// 构建查询条件,排除当前站点并且 id 不等于当前 id 的记录
|
||||||
|
$whereAll['shop_id'] = $_REQUEST['shop_id'];
|
||||||
|
$whereAll['id'] = array('neq', $_REQUEST['id']);
|
||||||
|
|
||||||
|
// 查询数据库中符合条件的所有记录
|
||||||
|
$otherRecords = $rsDb->where($whereAll)->select();
|
||||||
|
foreach ($otherRecords as $record) {
|
||||||
|
$existingRuning = $record['runing'] ?? '';
|
||||||
|
$existingRuningArray = array_filter(explode(',', $existingRuning), function ($value) {
|
||||||
|
return trim($value) !== '';
|
||||||
|
});
|
||||||
|
|
||||||
|
// 检查两个数组是否有重复元素
|
||||||
|
$intersection = array_intersect($submittedRuningArray, $existingRuningArray);
|
||||||
|
if (!empty($intersection)) {
|
||||||
|
throw new Exception('提交的航线与其他站点重复!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果 $_REQUEST['runing'] 为空字符串 或者null,将其设置为 null
|
||||||
|
$data['runing'] = trim($_REQUEST['runing']) === '' ? null : trim($_REQUEST['runing']);
|
||||||
|
if (!$rsDb->where($where)->save($data)) {
|
||||||
|
exit(json_encode(array('status' => 1, 'msg' => '站点航线执行操作成功!')));
|
||||||
|
throw new Exception('站点航线执行操作失败!');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*订单表操作*/
|
||||||
|
//前端提交数据校验
|
||||||
|
$where['id'] = intval($_REQUEST['order_id']);
|
||||||
|
$field = array('main_status', 'openid');
|
||||||
|
$order = $orderDb->where($where)->field($field)->find();
|
||||||
|
//只处理主状态已付款的订单 其他状态跳出
|
||||||
|
if ($order['main_status'] != '已付款') {
|
||||||
|
throw new Exception('参数有误');
|
||||||
|
}
|
||||||
|
//操作数据库 只能操作 主状态 执行状态 退款状态 执行飞机
|
||||||
|
if ($_REQUEST['main_status']) {
|
||||||
|
$data['main_status'] = htmlspecialchars($_REQUEST['main_status']);
|
||||||
|
}
|
||||||
|
if ($_REQUEST['shipment_status']) {
|
||||||
|
$data['shipment_status'] = htmlspecialchars($_REQUEST['shipment_status']);
|
||||||
|
}
|
||||||
|
if ($_REQUEST['refund_status']) {
|
||||||
|
$data['refund_status'] = htmlspecialchars($_REQUEST['refund_status']);
|
||||||
|
}
|
||||||
|
if ($_REQUEST['by_plane_id']) {
|
||||||
|
$data['by_plane_id'] = ($_REQUEST['by_plane_id'] == 'null') ? null : intval($_REQUEST['by_plane_id']);
|
||||||
|
}
|
||||||
|
if ($orderDb->where($where)->save($data)) { //修改数据
|
||||||
|
$topicPrefix = makeTopicPrefix($order['openid']); //小程序端用户订阅主题的前缀 ps:订单对应的用户的openid算出来的
|
||||||
|
// 提醒小程序端 刷新订单列表(mqtt)
|
||||||
|
$this->publish('refreshOrderList/' . $topicPrefix, 1);
|
||||||
|
} else {
|
||||||
|
throw new Exception('订单修改失败');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*提交事务*/
|
||||||
|
$rsDb->commit();
|
||||||
|
echo json_encode(array('status' => 1, 'msg' => '航线锁定和订单修改成功'));
|
||||||
|
} catch (Exception $e) {
|
||||||
|
/*回滚事务*/
|
||||||
|
$rsDb->rollback();
|
||||||
|
exit(json_encode(array('status' => 0, 'msg' => $e)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exit(json_encode(array('status' => 0, 'msg' => '参数有误')));
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @description: 只处理 主状态 为 已付款 的订单
|
* @description: 只处理 主状态 为 已付款 的订单
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user