.net EF 事物 订单流水号的生成 (二):观察者模式

  针对.net EF 事物 订单流水号的生成 (一)  的封装。

  数据依然不变。

using System;
using System.Linq;
using System.Transactions;

namespace ConsoleApplication1
{
    class Program
    {
        static pengbgDBEntities db = new pengbgDBEntities();
        static void Main(string[] args)
        {
            try
            {
                DAL dal = new DAL();
                dal.AddOrder += dal_AddOrder;
                var newOrderNo = dal.Tran(DAL.EnumOrderType.SM);
                Console.WriteLine("添加成功:" + newOrderNo);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }
            finally
            {
                Console.WriteLine("按任意键继续");
                Console.ReadKey();
            }
        }

        static int dal_AddOrder(string orderNo)
        {
            db.SalesOrder.Add(new SalesOrder() { UserName = Console.ReadLine(), OrderNo = orderNo, OrderDate = DateTime.Now });
            return db.SaveChanges();
        }
    }

    public class DAL
    {
        public delegate int DelTranOrder(string orderNo);
        public event DelTranOrder AddOrder;
        public pengbgDBEntities db = new pengbgDBEntities();

        public int Add(string orderNo)
        {
            return AddOrder(orderNo);
        }

        public string BulidOrderNo(EnumOrderType enunType)
        {
            var orderType = enunType.ToString();
            var flowNo = db.FlowNo.FirstOrDefault(x => x.OrderType == orderType);
            var flowNoStart = DateTime.Now.ToString("yyMMdd-");
            var flowNoEnd = "1";
            if (flowNo != null)
            {
                if (flowNo.OrderNo.Split(‘-‘)[0] != orderType + flowNoStart)
                {
                    flowNoEnd = (int.Parse(flowNo.OrderNo.Split(‘-‘)[1]) + 1).ToString();
                }
            }
            else
            {
                db.FlowNo.Add(new FlowNo { OrderNo = flowNoStart + flowNoEnd.PadLeft(5, ‘0‘), OrderType = orderType, Remark = "New" });
            }
            return orderType + flowNoStart + flowNoEnd.PadLeft(5, ‘0‘);
        }

        public string Tran(EnumOrderType orderType)
        {
            var newOrderType = BulidOrderNo(orderType);
            using (var scope = new TransactionScope())
            {
                AddOrder(newOrderType);
                var flowNo = db.FlowNo.FirstOrDefault(x => x.OrderType == orderType.ToString());
                if (flowNo != null)
                    flowNo.OrderNo = newOrderType;
                db.SaveChanges();
                scope.Complete();
            }
            return newOrderType;
        }

        public enum EnumOrderType
        {
            SM,//销售订单
            PM // 外发订单
            //......其他
        }
    }
}
时间: 2024-12-10 10:41:26

.net EF 事物 订单流水号的生成 (二):观察者模式的相关文章

Java并发生成不重复订单流水号

最近做一个订单模块要生成订单号,因为考虑到用Mysql主键做订单号在以后分库分表后会重复,就想到自己创建. 这里要涉及到并发操作,所以要么就用单例内部类,或者就是加锁,因为时间关系我先实现了内部类和锁,后续再用类把String替换了. 具体代码: package com.jzg.svsp.order.utils; import javax.validation.constraints.NotNull; import java.text.SimpleDateFormat; import java.

微信扫码支付与生成二维码

二维码 (1) 容错级别 L级(低) 7%的码字可以被恢复. M级(中) 的码字的15%可以被恢复. Q级(四分)的码字的25%可以被恢复. H级(高) 的码字的30%可以被恢复. (2) 二维码生成插件qrious qrious是一款基于HTML5 Canvas的纯JS二维码生成插件.通过qrious.js可以快速生成各种二维码,你可以控制二维码的尺寸颜色,还可以将生成的二维码进行Base64编码. qrious.js二维码插件的可用配置参数如下: 参数 类型 默认值 描述 backgroun

04 生成二维码、支付以及询单

上一节我们已经拿到了下单返回的code_url,这一节我们将生成二维码以完成支付. 1.前提约束 完成下单 https://www.jianshu.com/p/9a3d972aeb6d 2.操作步骤 在wxpay-demo/src/main/webapp下面引入qrious.min.js 在wxpay-demo/src/main/webapp下面创建index.jsp,将上一节生成的code_url出入以生成二维码 <%-- Created by IntelliJ IDEA. User: zha

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops

通过jquery-qrcode在线生成二维码

随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方便,借助二维码的话,用户拿起手机扫扫就可以直接进入系统. 基于这个应用场景,就上网研究下了网站二维码的实现方式,归纳起来有以下两种: 1.借助一些二维码生成网站或者二维码生成器生成二维码图片,然后挂在网站上,如码云 QR-Code (二维码) 在线生成器 优点:开发成本为零,能够快速实现多样化的二维

C# winform通过ThoughtWorks.QRCode生成二维码解码可以添加logo

首先要下载ThoughtWorks.QRCode.dll文件,添加引用. ThoughtWorks.QRCode.dll下载,点击下载 界面如下: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Win

Android:使用ZXing生成二维码(支持加入Logo图案)

ZXing是谷歌的一个开源库.能够用来生成二维码.扫描二维码.本文所介绍的是第一部分. 首先上效果图: ZXing相关各种文件官方下载地址:https://github.com/zxing/zxing/releases 或者在这里下载(仅仅有本项目所用的jar包,版本:3.2.0):链接: http://pan.baidu.com/s/1hq3s5EW password: mvg7 1.生成二维码的工具类 /** * 二维码生成工具类 */ public class QRCodeUtil { /

jquery生成二维码并实现图片下载

1.引入jquery的两个js文件 <script src="../scripts/erweima/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="../scripts/erweima/jquery.qrcode.min.js"></script> 2.准备一个展示二维码的div <div id="

生成二维码

PHPqrCode是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo, 查看地址:http://phpqrcode.sourceforge.net/.    下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本:参数$outfile表示是否输出二维码图片 文件,默认否:参数$level表示容错率,