钟表维修管理系统技术解析(六) 数据统计

通过统计维修单据,销售单据,采购单据的金额数据,对每年,每月,每日的金额进行统计,以图表的形式显示出来


2.6.1图(1)


2.6.1图(2)

营业额统计查询界面用到的控件有:

控件名称

说明

文本控件(input type=”text”)

第一要设置每个控件的id,第二设置大小不设置也有默认,第三(data-options)是数据操作:可以设置控件的一些属性和事件

按钮(easyui-linkbutton)

Morris插件

登陆功能的实现:

第一步:数据库


2.6.1图(3)

表1:工单录入表(pw_GongDianLuRu)

用于存放钟表录入的信息

列名

数据类型

主键/外键

说明

GongDanLuRuID

int

主键

工单录入ID

YuanShiDanHaoID

int

外键

原始单号ID

GongDanZhuanTaiID

int

外键

工单状态ID

JinEZhuangTaiID

int

外键

金额状态ID

GongDanLeiXingID

int

外键

工单类型ID

KeHuID

int

外键

客户ID

JianXiuLeiXingID

int

外键

检修类型ID

PinPaiID

int

外键

品牌ID

GongDanRiQi

date

工单日期

GongDanBianHao

nchar(50)

工单编号

SongXiuRiQi

data

送修日期

YuFanRiQi

data

预返日期

FenYongJinE

decimal(18,2)

费用金额

ZhongBiaoLeiXing

nchar(10)

钟表类型

BiaoKuan

nchar(10)

表款

GuiGe

text

规格/名称

XiuPeiJiLu

text

修配记录

JiXinXingHao

nchar(50)

机芯号

BiaoXingHao

nchar(50)

表型号

BiaoShenHao

nchar(50)

表身号

BiaoDaiJieShu

nchar(50)

表带节数

ZhongBiaoQiTaoMiaoShu

varchar(200)

钟表其他描述

WaiGuan

text

外观

KeHuZhiShu

varchar(200)

客户自述

YouXiaoFou

Bit

有效否

表2:采购单(pw_CaiGouDan)

列名

数据类型

主键/外键

说明

CaiGouDanID

int

主键

采购单ID

DaoHuoMenDianID

int

外键

到货门店ID

LuRuYuanID

int

外键

录入员ID

GongYingShangID

int

外键

供应商ID

SongHuoFangShiID

int

外键

送货方式ID

CaiGouLeiBieID

int

外键

采购类别ID

CaiGouFuKuanLeiXingID

int

外键

采购付款类型ID

FuKuanZhuangTaiID

int

外键

付款状态ID

RuKuZhuangTaiID

int

外键

入库状态ID

CaiGouDanBianHao

nchar(50)

采购单编号

DanJuZhuangTai

data

单据状态

CaiGouRiQi

data

采购日期

DaoHuoRiQi

decimal(18,2)

到货日期

JinE

nchar(10)

金额

FaPiaoHao

nchar(10)

发票号

BeiZhu

text

备注

DingGouFou

text

订购否

DeleteFou

nchar(50)

删除否

YouXiaoFou

nchar(50)

有效否

GengXinShiJian

nchar(50)

更新时间

表3:采购退货单单(pw_CaIGouTuiHuoDan)

列名

数据类型

主键/外键

说明

CaiGouTuiHuoDanID

int

主键

采购退货单ID

LuRuYuanID

int

外键

录入员ID

CaiGouDanID

int

外键

采购单ID

TuiHuoFangShiID

int

外键

退货方式ID

KuaiDiID

int

外键

快递ID

KuaiDiDanHao

nchar(50)

快递编号

TuiKuanZhuangTai

nchar(50)

退款状态

DanJuZhuangTai

nchar(50)

单据状态

CaiGouTuiHuoDanBianHao

nchar(50)

采购退货单编号

JinE

decimal(18,2)

金额

TuiHuoRiQi

Date

退货日期

GengXinRiQi

Date

更新日期

ChuKuFou

bit

出库否

YouXiaoFou

bit

有效否

DeleteFou

bit

删除否

BeiZhu

text

备注

表4:销售单(pw_XiaoShouDan)

列名

数据类型

主键/外键

说明

XiaoShouDanID

int

主键

销售单ID

LuRuYuanID

int

外键

录入员ID

FuKuanZhuangTaiID

int

外键

付款状态ID

KeHuID

int

外键

客户ID

PinPaiID

int

外键

品牌ID

ZhongBiaoKuanShiID

int

外键

钟表款式ID

XiaoShouLeiXingID

int

外键

销售类型ID

XiaoShouFangShiID

int

外键

销售方式ID

SongHuoFangShiID

int

外键

送货方式ID

FuKuanFangShiID

int

外键

付款方式ID

FuKuanLeiXingID

int

外键

付款类型ID

XiaoShouDanBianHao

nchar(10)

销售单编号

JieZhangBianHao

nchar(10)

结账编号

DiKeHao

nchar(10)

底壳号

XiaoShouRiQi

date

销售日期

YingShouJinE

decimal(18,2)

应收金额

ShiShouJinE

decimal(18,2)

实收金额

GengXinShiJian

datetime

更新时间

BeiZhu

nchar(50)

备注

BaoFeiYuanYin

nchar(50)

报废原因

YouXiaoFou

Bit

有效否

DeleteFou

Bit

删除否

表5:销售售后单(pw_XiaoShouShouHouDan)

列名

数据类型

主键/外键

说明

XiaoShouShouHouDanID

int

主键

销售售后单ID

LuRuYuanID

int

外键

录入员ID

XiaoShouDanID

int

外键

销售单ID

XiaoShouShouHouLeiXingID

int

外键

售后类型ID

XiaoShouShouHouDanBianHao

nchar(50)

售后单编号

RiQi

date

日期

JinE

decimal(18,2)

金额

GengXinShiJian

datetime

更新时间

YouXiaoFou

bit

有效否

DeleteFou

bit

删除否

BeiZhu

nchar(50)

备注

第二步:控制器(Controllers)


2.6.1图(4)

Linq语法:

/// <summary>
        /// 营业额统计
        /// </summary>
        /// <param name="Year">查询的年份</param>
        /// <param name="Month">查询的月份</param>
        /// <returns></returns>
        public ActionResult YingYeetongJi(string Year,string Month)
        {
            var MarketMoney = 0;//销售金额
            var ServiceMoney = 0;//维修结账金额
            var PurchaseMoney = 0;//采购金额
            var PurchaseReturnOfGoodsMoney = 0;//采购退货金额
            var MarketReturnOfGoodsMoney = 0;//销售退货金额
            var MarketExChangeMoneyMoney = 0;//销售换货金额
            var MarketGuaranteeMoney = 0;//销售保修金额
            var DateTimeData = Year;
            var Count = "12";
            var dtData = "";
            var dateCount = "";
            DataTable dt = new DataTable();
            dt.Columns.Add("d",typeof(string));
            dt.Columns.Add("visits",typeof(string));
            //判断是否查询月份
            if (Month != "" && Convert.ToInt32(Month.ToString().Trim()) > 0)
            {
                if (Convert.ToInt32(Month) < 10)
                {
                    Month = "0" + Month;
                }
                DateTimeData = DateTimeData + "-" + Month;
                Count = DateTime.DaysInMonth(Convert.ToInt32(Year),Convert.ToInt32(Month)).ToString();
            }

            //销售
            var Market = (from dtMarket in myMdl.pw_XiaoShouDan
                          where dtMarket.YouXiaoFou == true && dtMarket.FuKuanZhuangTaiID == 44
                          select dtMarket).AsEnumerable().Select(n => new
                          {
                              n.ShiShouJinE,XiaoShouRiQi = n.XiaoShouRiQi.Value.ToString("yyyy-MM-dd")
                          });
            //维修结账
            var Service = (from dtService in myMdl.pw_JieZhangQuBiao
                           where dtService.YouXiaoFou == true
                           select dtService).AsEnumerable().Select(n => new
                           {
                               n.ShiShouJinE,FuKuanRiQi = n.FuKuanRiQi.Value.ToString("yyyy-MM-dd")
                           });

            //采购
            var Purchase = (from dtPurchase in myMdl.pw_CaiGouDan
                            where dtPurchase.YouXiaoFou == true
                            select dtPurchase).AsEnumerable().Select(n => new
                            {
                                n.JinE,DaoHuoRiQi = n.DaoHuoRiQi.Value.ToString("yyyy-MM-dd")
                            });

            //采购退货
            var PurchaseReturnOfGoods = (from dtPurchaseReturnOfGoods in myMdl.pw_CaiGouTuiHuoDan
                                         where dtPurchaseReturnOfGoods.TuiKuanZhuangTai == "已退款" && dtPurchaseReturnOfGoods.YouXiaoFou == true
                                         select dtPurchaseReturnOfGoods).AsEnumerable().Select(n => new
                                         {
                                             n.JinE,GengXinRiQi = n.GengXinRiQi.Value.ToString("yyyy-MM-dd")
                                         });

            //销售退货单
            var MarketReturnOfGoods = (from dtMarketReturnOfGoods in myMdl.pw_XiaoShouShouHouDan
                                       where dtMarketReturnOfGoods.XiaoShouShouHouLeiXingID == 48 && dtMarketReturnOfGoods.YouXiaoFou == true
                                       select dtMarketReturnOfGoods).AsEnumerable().Select(n => new
                                       {
                                           n.JinE,RiQi = n.RiQi.Value.ToString("yyyy-MM-dd")
                                       });

            //销售换货单
            var MarketExChangeMoney = (from dtMarketExChangeMoney in myMdl.pw_XiaoShouShouHouDan
                                       where dtMarketExChangeMoney.XiaoShouShouHouLeiXingID == 49 && dtMarketExChangeMoney.YouXiaoFou == true
                                       select dtMarketExChangeMoney).AsEnumerable().Select(n => new
                                       {
                                           n.JinE,RiQi = n.RiQi.Value.ToString("yyyy-MM-dd")
                                       });
            //销售保修 
            var MarketGuarantee = (from dtMarketGuarantee in myMdl.pw_XiaoShouShouHouDan
                                   where dtMarketGuarantee.XiaoShouShouHouLeiXingID == 50 && dtMarketGuarantee.YouXiaoFou == true
                                   select dtMarketGuarantee).AsEnumerable().Select(n => new
                                   {
                                       n.JinE,RiQi = n.RiQi.Value.ToString("yyyy-MM-dd")
                                   });
            for (int i = 0; i < Convert.ToInt32(Count) + 1; i++)
            {
                if (Convert.ToInt32(i) < 10)
                {
                    dateCount = "0" + (i + 1).ToString();
                }
                else
                {
                    dateCount = i.ToString();
                }
                dtData = (DateTimeData + "-" + dateCount).ToString().Trim();
                MarketMoney = 0;//销售金额
                ServiceMoney = 0;//维修结账金额
                PurchaseMoney = 0;//采购金额
                PurchaseReturnOfGoodsMoney = 0;//采购退货金额
                MarketReturnOfGoodsMoney = 0;//销售退货金额
                MarketExChangeMoneyMoney = 0;//销售换货金额
                MarketGuaranteeMoney = 0;//销售保修金额
                DaTarow dtRow = dt.Rows.Add();
                //销售
                Market = Market.Where(n => n.XiaoShouRiQi.Contains(dtData));
                foreach (var item in Market)
                {
                    MarketMoney += Convert.ToInt32(item.ShiShouJinE);
                }
                //维修结账
                Service = Service.Where(n => n.FuKuanRiQi.Contains(dtData));
                foreach (var item in Service)
                {
                    ServiceMoney += Convert.ToInt32(item.ShiShouJinE);
                }
                //采购
                Purchase = Purchase.Where(n => n.DaoHuoRiQi.Contains(dtData));
                foreach (var item in Purchase)
                {
                    PurchaseMoney += Convert.ToInt32(item.JinE);
                }
                //采购退货
                PurchaseReturnOfGoods = PurchaseReturnOfGoods.Where(n => n.GengXinRiQi.Contains(dtData));
                foreach (var item in PurchaseReturnOfGoods)
                {
                    PurchaseReturnOfGoodsMoney += Convert.ToInt32(item.JinE);
                }
                //销售退货单
                MarketReturnOfGoods = MarketReturnOfGoods.Where(n => n.RiQi.Contains(dtData));
                foreach (var item in MarketReturnOfGoods)
                {
                    MarketReturnOfGoodsMoney += Convert.ToInt32(item.JinE);
                }
                //销售换货单
                MarketExChangeMoney = MarketExChangeMoney.Where(n => n.RiQi.Contains(dtData));
                foreach (var item in MarketExChangeMoney)
                {
                    MarketExChangeMoneyMoney += Convert.ToInt32(item.JinE);
                }
                //销售保修 
                MarketGuarantee = MarketGuarantee.Where(n => n.RiQi.Contains(dtData));
                foreach (var item in MarketGuarantee)
                {
                    MarketGuaranteeMoney += Convert.ToInt32(item.JinE);
                }
                var Money = ServiceMoney + MarketMoney - PurchaseMoney + PurchaseReturnOfGoodsMoney - MarketReturnOfGoodsMoney + MarketExChangeMoneyMoney + MarketGuaranteeMoney;
                dtRow["d"] = dtData;
                dtRow["visits"] = Money;
            }
            List<Dictionary<string,object>> Listreturn = ConvertHelper.DtToList(dt);
            return Json(Listreturn,JsonRequestBehavior.AllowGet);
        }

第三步、视图层(views)


2.6.1图(5)
HTML代码:
<div id="_revealloading"  class="reveal-loadding" style="display:block">
    <span class="loading" style="display:block">
    </span>
</div>
<br />
<table>
    <tr>
        <td style="width:50px"></td>
        <td><input type="text" id="Year" maxlength="4" onkeyup="value=value.replace(/[^\d]/g,''); inputFullYear(this);" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"/></td>
        <td><input type="text" id="Month" maxlength="2" onkeyup="value=value.replace(/[^\d]/g,''); inputMonth(this);" onbeforepaste="clipboardData.setData('text',''))"/></td>
        <td><input type="button" class="goodButton1" onclick="onClickLoadData()" style="width:100px;height:26px;border:0" value="查询" /></td>
    </tr>
</table>
<br />
    <center>
        <div style="width:1130px">
        <div class="row">
              <div class="col-lg-12">
                <div class="panel panel-primary">
                  <div class="panel-heading">
                    <h3 class="panel-title"><i class="fa fa-bar-chart-o"></i>营业额统计</h3>
                  </div>
                  <div class="panel-body">
                    <div id="morris-chart-area"></div>
                  </div>
                </div>
              </div>
        </div>
    </div>
    </center>

jQuery代码:

var data = undefined;
    var NowDate = new Date();//实例化date
    $(document).ready(function () {
        $("#Month").val(NowDate.getMonth() + 1)//绑定当前月份
        $("#Year").val(NowDate.getFullYear()); //绑定当前年份
        onClickLoadData();
        $('#Year').keydown(function (e) {
            if (e.keyCode == 13) {//键盘回车事件,触发查询功能
                onClickLoadData()
            }
        });
        $('#Month').keydown(function (e) {
            if (e.keyCode == 13) {//键盘回车事件,触发查询功能
                onClickLoadData()
            }
        });
    });

    function onClickLoadData() {
    //打开进度条
        $("#_revealloading").css("display","block");
        //通过ajax进行查询
        $.ajax({
            type: 'post',url: '/ShuJuBiaoGe/YingYeetongJi?Year=' + $("#Year").val() + '&Month=' + $("#Month").val(),success: function (requiredata) {
            //查询成功,返回数据
                data = requiredata;
                document.getElementById('morris-chart-area').innerHTML = ""; //清空插件的数据,否则数据会出现重复现象,图像重叠
                //为图表插件绑定数据
                Morris.Area({
                    element: 'morris-chart-area',data: data,xkey: 'd',ykeys: ['visits'],labels: ['金额(RMB)'],smooth: false
                });
                //关闭进度条
                $("#_revealloading").css("display","none");
            }
        });
    }
    function inputMonth(event) {
        if (event.value>12) {//限制月份不能输入超出12的数
            alert("月份数不能大于12!");
            $("#Month").val(NowDate.getMonth() + 1);
        }
    }
    function inputFullYear(event) {
        if (event.value > NowDate.getFullYear()) {//限制年份输入不能超出当前时间年份
            alert("年份数不能大于当前时间年份!");
            $("#Year").val(NowDate.getFullYear());
        }
    }

该资料仅供学习,禁止用于商业用途

钟表维修管理系统技术解析(六) 数据统计的更多相关文章

  1. ios – 避免将重复对象添加到领域

    我查询Parse.com中的数据并将其保存在本地的Realm数据库中.每个对象都有一个唯一的属性,但也有一个可能是一样的属性.避免将具有相同属性B的对象添加到领域数据库中最有效的方法是什么?

  2. android – greenDAO不会在表中生成FOREIGN KEY(…)约束

    当我创建如下所示的双向1:n关系时,生成器不会在表上使用任何FOREIGNKEY(…)约束.这是正常吗?是否应该在表中生成FOREIGNKEY(…)约束,还是仅在运行时通过代码强制执行?

  3. 使用spring jpa 如何给外键赋值

    这篇文章主要介绍了使用spring jpa 如何给外键赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. jpa使用注解生成表时无外键问题及解决

    这篇文章主要介绍了jpa使用注解生成表时无外键问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. HTML5中indexedDB 数据库的使用实例

    本篇文章主要介绍了HTML5中indexedDB 数据库的使用实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. Django中外键使用总结

    本文主要介绍了Django中外键使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. php – laravel errno 150外键约束形成错误

    有人可以帮我解决这个问题吗?有3个表有2个外键:运行迁移后出错:对于外键,引用和引用字段必须具有完全相同的数据类型.您可以在用户和公司中创建id字段作为有符号整数.但是,您将两个外键都创建为无符号整数,因此密钥的创建失败.您需要将unsigned子句添加到id字段定义,或者从外键字段中删除unsigned子句.

  8. 你不会使用外键的原因? [php MySQL]

    如果你想要一个例子,他们基本上有调查,一个调查有一系列的问题.一个问题是调查的一部分,因此它将其列为专栏.这几乎是它,但是它随处可见.我很感激任何洞察力:)原始开发人员可能选择使用MyISAM或任何其他不支持外键约束的存储引擎.

  9. 单元测试 – 在PHPUnit / DBUnit中设置外键约束

    我正在开发用于测试模型功能的单元测试.我使用PHPPDO与DBUnit1.1.2和PHPUnit3.6.10,我的数据集是一个yml文件.在数据库中加载灯具时,我需要关闭外键检查.之后,我需要再次打开它,以便我可以在这些约束下运行我的测试.以下是我广义Testcase文件中的代码片段,我将为我开发的任何新的测试用例添加代码.当我在这些设置下运行测试用例时,我发现$pdo->exec()不执行.我的做法有什么问题?有更好的选择吗?改变你的功能setUp这样

  10. php – RedBean是否需要“id”主键?

    如果使用RedBeanORM,是否需要向数据库中的每个表添加名为“id”的主键?在我的数据库中,我有一些表具有2或3个字段的主键对,或者其他名称不是“id”的主键例:table1–存储帖子:table2–为帖子存储元数据:RedBean会使用这种数据库结构吗?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部