C# TransactionScope 分布式事物使用实例

简介: protected void btnSave_Click(object sender, EventArgs e) { var order = new BLL.
protected void btnSave_Click(object sender, EventArgs e)
    {
        var order = new BLL.A_OrderInfo().GetModel(this.OrderId);//订单
        if (order != null && IsUpOrder(order.OrderState, order.PayWay, order.PayState))
        {
            var itemIds = Request.Form.GetValues("hdId");
            var proIdList = Request.Form.GetValues("hdProId");//新商品ID
            var proPriceList = Request.Form.GetValues("txtPreProPrice");//优惠价格
            var proNumList = Request.Form.GetValues("txtProNum");//商品数量

            using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                try
                {
                    //订单原来商品
                    var oldOrderPro = new BLL.A_OrderPro().GetList(null, "OrderId=" + order.OrderId, null);
                    //备份原来订单商品
                    new BLL.A_OrderProBak().Add(oldOrderPro);
                    //还原订单原来商品库存
                    Common.OperGoodsStockAndInsert(order.OrderId, order.OrderCode, 0, (int)Enums.StockRemarkType.修改订单商品增加库存, (int)Enums.StockType.虚拟库存, "虚拟库存-修改订单商品增加库存-正品-入库");
                    var newOrderPro = this.AddNewOrderPro(order.OrderId, order.OrderCode, itemIds, proIdList, proPriceList, proNumList);
                    if (newOrderPro != null)
                    {
                        //删除订单原来商品
                        new BLL.A_OrderPro().DeleteByOrderId(order.OrderId);

                        //修改订单金额
                        int oldStatus = order.OrderState;//保存原始订单状态
                        order.GoodsAmount = Util.GetDecimal(txtGoodsAmount.Text);//商品金额
                        order.IntegralMoney = Util.GetDecimal(txtIntegralMoney.Text);//积分抵扣金额
                        order.CouponAmount = Util.GetInt(txtCouponAmount.Text);//优惠卷抵扣金额
                        order.OrderFreight = Util.GetDecimal(txtOrderFreight.Text);//运费金额
                        order.OrderAmount = Util.GetDecimal(txtOrderAmount.Text);//订单金额
                        order.PayAmount = Util.GetDecimal(txtPayAmount.Text);//已支付金额
                        order.NeedPayAmount = Util.GetDecimal(txtNeedPayAmount.Text);//应支付金额
                        if (order.NeedPayAmount == 0 && order.PayWay != (int)Enums.OrderPayWay.NotPay && order.PayState == (int)Enums.PayState.未支付)
                        {
                            order.PayWay = (int)Enums.OrderPayWay.NotPay;
                            order.PayState = (int)Enums.PayState.已支付;
                            order.OrderState = (int)Enums.OrderState.等待处理中;

                        }
                        if (order.NeedPayAmount > 0 && order.PayWay == (int)Enums.OrderPayWay.NotPay)
                        {
                            order.PayWay = (int)Enums.OrderPayWay.Bill99;
                            order.PayState = (int)Enums.PayState.未支付;
                            order.OrderState = (int)Enums.OrderState.等待支付中;
                        }
                        new BLL.A_OrderInfo().Update(order);

                        //写订单状态日志
                        OperOrderLog(oldStatus, order);

                        //添加订单新商品
                        new BLL.A_OrderPro().Add(newOrderPro);
                        //减少订单新商品库存
                        Common.OperGoodsStockAndInsert(order.OrderId, order.OrderCode, 1, (int)Enums.StockRemarkType.修改订单商品减少库存, (int)Enums.StockType.虚拟库存, "虚拟库存-修改订单商品扣库存-正品-出库");
                        scope.Complete();

                        JScript.Alert("修改订单成功");
                        JScript.Redirect("/SysManager/OrderManager/OrderEdit.aspx");
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("发送信息异常,原因:" + ex.Message);
                }
                finally
                {
                    scope.Dispose();
                }
            }
        }
        else
        {
            JScript.Alert("此订单不能修改");
            JScript.Redirect("/SysManager/OrderManager/OrderEdit.aspx");
        }
    }

    //是否可以修改
    private bool IsUpOrder(int orderState, int payWay, int payState)
    {
        if (orderState <= (int)Enums.OrderState.已发送到仓储)//&& (payWay == (int)Enums.OrderPayWay.NotPay || payState == (int)Enums.PayState.未支付)
            return true;
        else
            return false;
    }

目录
相关文章
|
10月前
|
缓存 C#
C# 操作路径(Path)类方法的使用与解析运行实例
C# 操作路径(Path)类方法的使用与解析运行实例
|
12月前
|
数据采集 JSON API
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
|
2月前
|
传感器 开发框架 JSON
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
|
3月前
|
文字识别 自然语言处理 C#
印刷文字识别使用问题之C#发票识别的代码实例在哪里可以查看
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
4月前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
5月前
|
消息中间件 人工智能 Java
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
131 1
|
消息中间件 监控 数据可视化
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例
influxDB的官网下载地址 https://portal.influxdata.com/downloads/打开以后,如下图所示,可以选择版本号,以及平台。此处咱们选择windows平台。不过此处没有实际的可以下载的地方,着实比较过分,不过咱们可以另辟蹊径。
1035 0
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例
|
5月前
|
数据可视化 Linux 调度
DolphinScheduler【部署 01】分布式可视化工作流任务调度工具DolphinScheduler部署使用实例分享(一篇入门学会使用DolphinScheduler)
DolphinScheduler【部署 01】分布式可视化工作流任务调度工具DolphinScheduler部署使用实例分享(一篇入门学会使用DolphinScheduler)
658 0
|
5月前
|
监控 前端开发 应用服务中间件
Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
704 0
|
5月前
|
监控 安全 API
深入探讨API安全性与C#实例演示
在本篇文章中,我们将深入研究 API 的安全性,并通过使用 C# 的实际示例探索一些基本机制。
89 0
下一篇
无影云桌面