【Side Project】 (老板)订单清单-与资料库交换资料

上一篇中,我们已经处理完前端每份餐点、每张订单的状态都处理完了。
顺带一提,如果要在使用返回按键时保留原本餐点的状态时,
我们可以在undo_order()中增加以下两行程序码:

cb_id = `cb_${head.uid}_${item.uid}`
$(`#${cb_id}`).prop('checked', item.itemDone)

https://ithelp.ithome.com.tw/upload/images/20211011/20115941lvs7PNyGlq.jpg

这篇开始我们会将前端的清单资料,
与後台资料库中的资料做交换。
这边会分成几个部份去处理:

  1. 将资料传到後台
  2. 取得後台新的资料
  3. 更新渲染画面
  4. 交换资料的时机

资料交换

  1. 打开 Proprietor.cshtml
  2. ajax建立与後台的连线
function Exchange(is_init) {
        //第一次进网页则删除原本的localStorage
        if (is_init) {
            localStorage.removeItem('done_data')
            localStorage.removeItem('undo_data')
            
        }

        var done_data = localStorage.getItem('done_data') === null ? [] : JSON.parse(localStorage.getItem("done_data"))
        var undo_data = localStorage.getItem("undo_data") === null ? [] : JSON.parse(localStorage.getItem("undo_data"))
        var data = undo_data
        done_data.forEach((item) => {
            data[data.length] = item
        })
        var data_string = JSON.stringify(data)
        
        $.ajax({
        url: "@Url.Action("ExchangeData")",
            type: "post",
            data: {
                "data": data_string
            },
            dataType: "json",
            success: function (new_data) {
                var done_data = localStorage.getItem('done_data') === null ? [] : JSON.parse(localStorage.getItem("done_data"))
                var undo_data = localStorage.getItem("undo_data") === null ? [] : JSON.parse(localStorage.getItem("undo_data"))
                
                new_data.forEach((item) => {
                    
                    if (item.head.orderDone) {
                        done_order(item.head, item.bodys)
                        done_data[done_data.length] = item
                    }
                    else {
                        undo_order(item.head, item.bodys)
                        undo_data[undo_data.length] = item
                    }
                })
                localStorage.setItem("undo_data", JSON.stringify(undo_data))
                localStorage.setItem("done_data", JSON.stringify(done_data))

        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert("status: " + xhr.status);
            alert(xhr.responseText);
            alert(thrownError);
        },
        complete: function () {}

        })
    }
  1. 设定触发时机
<script>
    //初始化
    Exchange(true)
    // 固定时间交换资料
    setInterval(Exchange, 10000,false);
</script>
  1. 打开HomeController.cs 新增 ExchangeData()
[HttpPost]
        public IActionResult ExchangeData(string data)
        {
            Console.WriteLine("data:" + data);
            
            var proprietor = ProprietorModel.proprietor;
            //更新资料
            bool successful = proprietor.UpdateOrder(_config, data);
            //取得今天的订单清单
            var orders = proprietor.SelectOrder(_config);
            //比对出新的资料
            var new_orders = proprietor.DataCompare(orders, data);
            //自动转成json格式
            return Json(new_orders);
        }
  1. 打开 ProprietorModel.cs
  2. 新增 UpdateOrder()
public bool UpdateOrder(IConfiguration config,string orders_string)
        {
            var successful = false;
            var orders = JsonConvert.DeserializeObject<List<Order>>(orders_string);
            //连线设定
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                //连线字串
                ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
                DbType = DbType.SqlServer,//连线类型
                IsAutoCloseConnection = true //自动关闭连线
            });


            try
            {

                //当执行时,触发事件
                db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql);//查看SQL语法
                };
                //begin tran
                db.BeginTran();
                //取得菜单表头,并排序(正序)
                foreach(var order in orders)
                {
                    //更新表头中的订单状态
                    var result_h = db.Updateable(order.head).UpdateColumns(head => new { head.OrderDone }).ExecuteCommand();
                    //更新表身中的餐点状态
                    var result_b = db.Updateable(order.bodys).UpdateColumns(body => new { body.ItemDone }).ExecuteCommand();
                }
                db.CommitTran();
                successful = true;
            }
            catch
            {
                successful = false;
                db.RollbackTran();//rollback
                throw;
            }
            return successful;
        }
  1. 新增SelectOrder()
public List<Order> SelectOrder(IConfiguration config)
        {
            var order_list = new List<Order>();
            //连线设定
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                //连线字串
                ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
                DbType = DbType.SqlServer,//连线类型
                IsAutoCloseConnection = true //自动关闭连线
            });


            try
            {

                //当执行时,触发事件
                db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql);//查看SQL语法
                };
                //begin tran
                db.BeginTran();
                //取得菜单表头,并排序(正序)
                var list_h = db.Queryable<Menulisth>().Where(head => head.Createtime >= DateTime.Today).OrderBy(head => head.Createtime, OrderByType.Asc).ToList();
                var list_b = db.Queryable<Menulistb, Menulisth>((body, head) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
                    .Where((body, head) => head.Createtime >= DateTime.Today)
                    .OrderBy((body, head) => head.Createtime, OrderByType.Asc)
                    .Select<Menulistb>().ToList();
                //将表头加入到表身资料写入
                foreach (var head in list_h)
                {
                    head.Formnum = head.Formnum.Replace(" ", "").Trim();
                    var order = new Order();
                    //加入表头
                    order.head = head;
                    //加入表身
                    foreach (var body in list_b)
                    {
                        if (body.H_uid == head.Uid)
                        {
                            body.Item = body.Item.Replace(" ", "").Trim();
                            order.bodys.Add(body);
                        }
                    }
                    order_list.Add(order);

                }

                db.CommitTran();
            }
            catch
            {
                db.RollbackTran();//rollback
                throw;
            }
            return order_list;
        }
  1. 新增 DataCompare()
public List<Order> DataCompare(List<Order> db_orders, string data)
        {
            var client_orders = JsonConvert.DeserializeObject<List<Order>>(data);
            var order_Enumable = from db in db_orders
                        where !(from client in client_orders
                                select client.head.Uid)
                                .Contains(db.head.Uid)
                        select db;
            var orders = order_Enumable.ToList();
            return orders;
        }

这样就完成了。来看一下完整的Proprietor.cshtml 中script语法
https://ithelp.ithome.com.tw/upload/images/20211011/20115941ETV0g3Go9m.jpg
9. 成果
https://i.imgur.com/2BGc63y.gif

结语

前面做的时候分成未完成清单、和已完成清单两个部分来实作。
当开发到後面的时候会发现,其实这两段程序码有非常多重覆的地方。
像是这样的情形在开发中很常会发生,
我们可以透过不断的CodeReview,来精简程序码。
这样久而久之就能撰写出更加优美的程序码。


<<:  Day 26 - Divide and Conquer & Dynamic Programming

>>:  Day28_隐私盾协定听起来好酷呀-2021/10/11

Day 20 实作表单 (3)

前言 今天要来接续表单的制作,不同於前两天的是,今天的主题比较明确,我们要写各式各样的 dashbo...

Day 26 战斗民族-俄罗斯酸奶牛肉 Beef Stroganoff

为了做火焰烤饼而自制酸奶油,做完烤饼还有剩下的酸奶油,所以试着找了其他酸奶油料了,意外发现了俄罗斯的...

多工的陷阱

前言 今天来聊一个看起来不浪费的浪费。 多工会怎样 在我们的成长过程中,应该不只一次会听到前辈们的告...

每个人都该学的30个Python技巧|技巧 4:字串格式化(字幕、衬乐、练习)

在昨天的影片中提到了输入命令以及输出命令,这两种是程序之中非常基本的命令,今天就稍微进阶一点,让输出...

DAY 8 Big Data 5Vs – Velocity(多样性) 资料结构

第二个「V」要思考的数据问题是多样性Velocity,资料的格式有千百种,从数不完的副档名就知道。软...