JS轮询任务查询订单退款状态

出现问题:

        因为订单的支付不是普通的微信支付,是第三方支付,而且由于该三方支付自己内部设置的一些情况,导致退款的时候,发起了退款申请,但是会在15~20秒左右,才会返回结果,不像微信支付,几秒内就会有返回结果。

解决办法:

        订单发起请求之后,需要给操作者第一时间内返回状态,哪怕只是操作中的状态,然后需要每隔几秒轮训查询状态,然后即时给操作着反馈。

html代码:

//html代码,需要操作者填写的信息

<input type="hidden" name="order_id" id="order_id" {if condition="!empty($order['id'])"}value="{$order['id']}"{/if}>
<div class="layui-form-item">
	<label for="L_isin" class="layui-form-label">退款状态:</label>
	<div class="layui-input-inline">
		<input type="radio" name="status" value="1" title="同意退款">
		<input type="radio" name="status" value="2" title="拒绝退款" {if condition="$order['refund_status'] eq '1'"}disabled{/if}>
    </div>
</div>
<div class="layui-form-item">
	<label for="L_title" class="layui-form-label">拒绝原因:</label>
	<div class="layui-input-inline">
		<input type="text" id="refund_desc" name="refund_desc" class="layui-input"/>
	</div>
</div>

//需要显示的遮罩层代码
<div id="overlay">
            
</div>

遮罩层的样式代码

<style>
	.layui-form-label{width: 130px;padding: 5px 15px;}
	.layui-form-item{margin-bottom: 0px;}
	.content{margin-top: 7px;}
	.layui-form-radio{    margin: 0px 10px 0 0;}
	.progress-father {
	  display: flex;
	  flex-direction: column;
	}
    .progress-container {
      display: flex;
      align-items: center;
      margin-bottom: 2px;
    }

    .progress-dot {
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background-color: #03c060;
      margin-right: 10px;
    }

    .progress-line {
      height: 20px;
      width: 2px;
      background-color: #FFF000;
      margin-left: 4px;
    }

    .progress-node {
      margin-left: 10px;
    }
    
    .activeCls {
    position: relative;
    margin-left: 14px;
    margin-top: 16px;
    margin-right: 6px;
      &:before {
        content: "";
        position: absolute;
        right: 0;
        bottom: 0;
        border: 9px solid #f90;
        border-radius: 50%;
        
        /*border-top-color: transparent;*/
        /*border-left-color: transparent;*/
      }
      &:after {
        content: "";
        width: 5px;
        height: 10px;
        position: absolute;
        right: 6px;
        bottom: 5px;
        border: 1px solid #fff;
        border-top-color: transparent;
        border-left-color: transparent;
        transform: rotate(45deg);
      }
    }
    #overlay {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      z-index: 9999;
      display: none;
    }

    .overlay-content {
      width: 300px;
      height: 300px;
      background-color: #fff;
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      z-index: 10000;
      display: none;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }

</style>

js代码

<script>

  	$(document).ready(function(){
		$('#show_overlay_btn').click(function() {
            $('#overlay').show();
            $('.overlay-content').show();
         });
	})

	//关闭遮罩层按钮
	$(document).on('click', '#show_overlay_btn_close', function() {

    	clearInterval(time_id);//清空轮询任务
    	//隐藏进度代码
        $('#overlay').hide();
        $('.overlay-content').hide();

        //刷新页面
        // window.location.reload();
        window.parent.location.reload();

	})


    layui.use(['layer'], function() {
      var layer = layui.layer;


    // 在点击事件中调用 showOrderProgress 函数
      $('#submit_but').on('click', function() {
      	//获取值
      	var order_id = $('#order_id').val();
      	var refund_desc = $('#refund_desc').val();
      	var status = $('input:radio:checked').val();

      	$.ajax({
				url: '/admin/Order/mod_orderv2002',
				type: 'post',
				data: {
					order_id:order_id,
					refund_desc:refund_desc,
					status:status
				},
				dataType: 'json',
				success: function (info) {
					console.log(info)
					if (info.code == 1) {
						if (info.next_flag == 1) {
							getOrderRefundStatus();
							window.time_id = setInterval(getOrderRefundStatus,4000);
						}else{
							layer.msg(info.msg,{time:2000});
						}
					}else{
						layer.msg(info.msg,{time:2000});

					}
				
				}
			});


        
      });

    function getOrderRefundStatus(order_id){
    	var order_id = $('#order_id').val();
    		$.ajax({
				url: '/admin/Order/getOrderRefundStatus2',
				type: 'post',
				data: {
					order_id:order_id
				},
				dataType: 'json',
				success: function (info) {
					console.log(info)
					if (info.code === 1) {
						if(info.status == 0){
							info_data = `<div class="overlay-content">
				                <div class="progress-father">
				                    <div class="progress-father">
				        	            <div class="progress-container">
				        	              <div class="progress-dot"></div>
				        	              <div class="progress-node">退款已申请</div>
				        	            </div>
				        	            <div class="progress-line"></div>
				        	            <div class="progress-container">
				        	              <div class="activeCls"></div>
				        	              <div class="progress-node">正在退款中</div>
				        	            </div>
				        	             <div class="progress-line"></div>
				        	            <div class="progress-container">
				        	              <div class="progress-dot"></div>
				        	              <div class="progress-node"><span style="color:grey;">退款已完成</span></div>
				        	            </div>
					                </div>
				                </div>
				                <button class="layui-btn"  id="show_overlay_btn_close"  style="margin-top: 30px;">关闭</button>
				            </div>`;

				            $('#overlay').show();
	            			$('.overlay-content').show();
				            document.getElementById("overlay").innerHTML= info_data;
						}

						if(info.status == 1){
							info_data = `<div class="overlay-content">
				                <div class="progress-father">
				                    <div class="progress-father">
				        	            <div class="progress-container">
				        	              <div class="progress-dot"></div>
				        	              <div class="progress-node">退款已申请</div>
				        	            </div>
				        	            <div class="progress-line"></div>
				        	            <div class="progress-container">
				        	              <div class="progress-dot"></div>
				        	              <div class="progress-node">正在退款中</div>
				        	            </div>
				        	             <div class="progress-line"></div>
				        	            <div class="progress-container">
				        	              <div class="activeCls"></div>
				        	              <div class="progress-node">退款已完成</div>
				        	            </div>
					                </div>
				                </div>
				                <button class="layui-btn"  id="show_overlay_btn_close"  style="margin-top: 30px;">关闭</button>
				            </div>`;

				            $('#overlay').show();
	            			$('.overlay-content').show();
				            document.getElementById("overlay").innerHTML= info_data;
				            clearInterval(time_id);//清空轮询任务
						}

						if(info.status == 2){
							layer.msg(info.msg,{time:2000});
							clearInterval(time_id);//清空轮询任务
						}

					}else{
						layer.msg(info.msg,{time:2000});
						clearInterval(time_id);//清空轮询任务
					}
				
				}
			});

    }

    });


</script>

PHP后端代码,因为后端代码涉及的逻辑复杂,因此,只是将返回值填写上,供前端调用调试

public function mod_orderv2002()
    {
        $return1 = ['code' => 0, 'msg' => '订单无操作', 'next_flag' => 0];
        $return2 = ['code' => 1, 'msg' => '退款进行中', 'next_flag' => 1];
        return $return2;
    }

    public function getOrderRefundStatus2()
    {
        $return1 = ['code' => 0, 'msg' => '订单不存在', 'status' => 0];
        $return2 = ['code' => 1, 'msg' => '退款进行中', 'status' => 0];
        $return3 = ['code' => 1, 'msg' => '退款已完成', 'status' => 1];
        $return4 = ['code' => 1, 'msg' => '退款失败', 'status' => 2];
        return $return2;
    }

使用效果

后端代码都是显示正在进行中

轮询的任务一直在跑,同时,弹框内容因为一直是进行中,然后就不会变

此时后台改为退款已完成

轮询任务停止,同时弹框内容变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/243584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ISCTF2023 Reverse方向 WP

文章目录 ReversecrackmeEasyRebabyReeasy_z3FloweyRSAeasy_flower_teamfx_rez3_revengeWHERE Reverse crackme 、 加了UPX壳&#xff0c;可以看到EP Section处UPX标识被修改了 用WinHex修改 之后UPX脱壳 得到flag。 EasyRe 逆向一下&#xff0c;先逆序&#xff0c;再做一些…

台阶仪在大型基板应用有哪些

探针式轮廓仪&#xff08;台阶仪&#xff09;是一种用于测量物体表面轮廓和形状的仪器。在大型基板应用中&#xff0c;它可能被用于检测和分析半导体器件、平板显示屏、光伏电池板等大尺寸基板上的微小结构和形状。这样的测量对于确保生产质量、提高制造效率和优化工艺非常重要…

cfa一级考生复习经验分享系列(三)

从总成绩可以看出&#xff0c;位于90%水平之上&#xff0c;且置信区间全体均高于90%线。 从各科目成绩可以看出&#xff0c;所有科目均位于90%线上或高于90%线&#xff0c;其中&#xff0c;另类与衍生、公司金额、经济学、权益投资、固定收益、财报分析表现较好&#xff0c;目测…

张驰课堂:在线六西格玛认证,成就个人职业发展

随着数字化学习平台的兴起&#xff0c;六西格玛的学习方式更加灵活。以下是线上学习平台与传统面授培训的对比&#xff1a; 线上学习平台&#xff1a; 灵活性&#xff1a;学员可以根据自己的时间安排自学&#xff0c;不受地点限制。 成本效益&#xff1a;通常在线课程费用较低…

MySQL中的时间函数整理汇总

1.获取当前时间 -- 获取当前时间 SELECT NOW(); -- 获取当前日期 SELECT CURDATE(); -- 获取当前时分秒 SELECT CURTIME(); 2.获取对应日期对应的年/月/日/月份名/星期数 -- 返回对应日期对应的年/月/日/月份名/星期数 select year(now())as 年,month(now())as 月,day(now())…

迅速理解什么是通信前置机

通信前置机设在两个通信对象之间&#xff0c;是实质性的物理服务器&#xff0c;适应不同通信协议或数据格式之间的相互转换。 前置机的作用&#xff1a; 隔离——隔离客户端与服务端&#xff0c;保障后端安全减负——处理非核心业务&#xff0c;分担后端服务器压力&#xff0…

CBTC2024 • 零碳未来!CBTC上海储能技术展览会

国际氢能投融资与发展联盟、 湖南省电池产业协会 、沪粤储能产业联盟主办的一场备受瞩目的盛会——2024年CBTC上海国际储能技术展。储能技术是当今全球能源领域的核心热点之一&#xff0c;也是实现能源转型和可持续发展的重要途径。CBTC上海国际储能技术展是全球规模最大、最具…

临界资源访问一个有趣现象

先看一个例子&#xff1a;我们创建10个线程&#xff0c;每一个线程对同一个地址上的值都进行加一100000次&#xff0c;那最后结果是不是1000000呢&#xff1f; #include <stdio.h> #include <pthread.h> #include <unistd.h>#define THREAD_COUNT 10void …

阿里云Centos8安装Dockers详细过程

一、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…

OpenHarmony应用编译 - 如何在源码中编译复杂应用

功能简介 在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中&#xff0c;目前有两种编译预安装应用hap包的方式&#xff0c;一种为随系统编译时&#xff0c;编译应用源码生成hap包的方式&#xff0c;另一种是将已生成的hap包放入系统源码中&#xff0c;再进行打包…

three.js聚光源SpotLight例子

效果&#xff1a; 说明&#xff1a;这里创建了SphereGeometry 球缓冲几何体&#xff0c;使用的材质是兰伯特网格材质MeshLambertMaterial&#xff0c;并对球缓冲几何体使用了纹理贴图效果&#xff0c;添加了聚光源&#xff0c;全部代码如下&#xff1a; <template><d…

Redis队列原理解析:让你的应用程序运行更加稳定!

一、消息队列简介 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的队列。最简单的消息队列模型包括 3 个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理&#xff08;Message Broker&#xff09;生产者…

java 执行linux 命令

文章目录 前言一、linux命令执行二、使用步骤三、踩坑 前言 java 执行linux 命令&#xff1b; 本文模拟复制linux文件到指定文件夹后打zip包后返回zip名称&#xff0c;提供给下载接口下载zip&#xff1b; 一、linux命令执行 linux命令执行Process process Runtime.getRunti…

【已解决】java 无法将类 XX类中的构造器 X应用到给定类型

原因&#xff1a; 实际参数列表和形式参数列表长度不同 解决方法&#xff1a; 给类添加AllArgsConstructor注解即可。

什么是跨站脚本攻击(XSS)?如何防止它?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

猫粮哪个牌子质量好性价比高?口碑比较好的主食冻干猫粮牌子推荐

猫咪生骨肉主食冻干猫粮喂养方式是越来越火了&#xff0c;作为一个离职的十年经验宠物护理师&#xff0c;对宠物健康营养方面的知识一直在研究&#xff0c;不光是为了我自己养的猫咪身体健康&#xff0c;也要为客户的猫咪健康负责&#xff01;现在很多养猫人士对主食冻干猫粮喂…

RocketMQ 服务搭建

目录 概述RocketMQ 单机服务搭建搭建架构相关地址前置操作NameServer 启动配置启动解决 java 版本的问题 Broker 启动测试关闭 结束 概述 学习此文&#xff0c;可以快速的搭建一个单机的 RocketMQ 服务。 RocketMQ 单机服务搭建 搭建架构 相关地址 RocketMQ官网地址二进制下…

什么台灯好用不伤眼睛?适合考公使用的台灯推荐

随着时代的发展与进步&#xff0c;不管是办公族还是学生党的压力也越来越大的&#xff0c;不少人在晚上回去之后仍然需要学习、工作&#xff0c;这样的一件试几乎成为了“家常便饭”&#xff0c;而这个过程中必不可少就是台灯。有些人为了保护眼睛会选择护眼台灯&#xff0c;但…

关于AISD300系列三相智能安全配电装置的详细介绍-安科瑞 蒋静

1概述 AISD300系列三相智能安全配电装置是安科瑞专为低压配电侧开发的一款智能安全配电产品&#xff0c;本产品主要针对低压配电系统人身触电、线路老化、短路、漏电等原因引起电气安全问题而设计。 产品主要应用于学校、加油站、医院、银行、疗养院、康复中心、敬老院、酒店…

大洋钻探系列之四“决心号”钻探船

乔迪斯决心号&#xff08;英文&#xff1a;JOIDES Resolution&#xff09;大洋钻探船是大洋钻探所使用的一艘钻探船&#xff0c;是美国Sedco公司和英国石油公司所属的一艘商用石油勘探船“Sedco/BP 471号”改装而来的。“乔迪斯”音译自地球深部取样海洋研究机构联合体&#xf…