<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>最低库存量/最高库存量计算</title></head><body onload="draw()"><canvas id="myCanvus" width="1240px" height="240px" style="border:1px dashed black;">出现文字表示你的浏览器不支持HTML5</canvas></body>
</html>
<script type="text/javascript">
<!--
function draw(){var canvas=document.getElementById("myCanvus");var canvasWidth=1240;var canvasHeight=240;var context=canvas.getContext("2d");context.fillStyle = "white";context.fillRect(0, 0, canvasWidth, canvasHeight);context.strokeStyle = "black";context.fillStyle = "black";context.save();// 进行坐标变换:把原点放在左下角,东方为X轴正向,北方为Y轴正向var offset=20;// 偏移值,用来画坐标轴
context.save();context.translate(0+offset,canvasHeight-offset);context.rotate(getRad(180));context.scale(-1,1);        drawAxisX(context,canvasWidth-40);drawAxisY(context);// 出库数据,这是主动数据var outbounds=[0,70,0,70,0,60,0,60,0,70,0,70,0,70,0,70,0,70,0,70,0,70,0,70,];var daysales=0;// 日销售量var sum=0;// 日销售量=出库数据均值for(var i=0;i<outbounds.length;i++){sum+=outbounds[i];}daysales=sum/outbounds.length;
    console.log("日销售量="+daysales);// 零件对象,固有属性数据var piece=new Object();piece.actualStock=100;// 当前实际库存量,单位个
    piece.leadtime=1;// 到货天数,单位天
    piece.safeday=0.5;// 安全系数,单位天
    piece.supplyGap=2;//供应间隔日数,单位天
    piece.reorganizeDay=2;//整理准备日数,单位天// 最低库存量var minStorage=daysales*(piece.leadtime+piece.safeday);console.log("最低库存量="+minStorage);// 最高库存量var maxStorage=daysales*(piece.supplyGap+piece.reorganizeDay+piece.safeday);console.log("最高库存量="+maxStorage);// 入库数据,这是被动数据var inbounds=[50,0,50,0,50,0,50,0,50,0,90,0,90,0,90,0,90,0,40,0,60,0,70,0,];drawStockCurve(context,piece.actualStock,inbounds,outbounds,minStorage,maxStorage);drawBounds(context,minStorage,maxStorage,canvasWidth-40);context.restore();context.fillText("每日库存变化折线,红点意味着低于安全库存,黄点意味着超储",400,50);// 计算库存周转率var outTotal=0;// 出库总金额// 出库总金额=出库量累计for(var i=0;i<outbounds.length;i++){outTotal+=outbounds[i];}console.log("出库总金额="+outTotal);// 总库存金额var inStock=piece.actualStock;sum=0;for(var i=0;i<inbounds.length;i++){inStock=inStock+inbounds[i]-outbounds[i];sum+=inStock;}console.log("inStock="+inStock);var inAvg=sum/inbounds.length;// 平均库存量/平均库存金额
    console.log("平均库存金额="+inAvg);var storageRate=outTotal/inAvg*100;
    console.log("库存周转率="+storageRate);context.fillText("库存周转率="+toCurrency(""+storageRate+"")+"%",1000,40);context.fillText("库存",10,20);context.fillText("日期",1200,235);
}function drawBounds(ctx,minStorage,maxStorage,axisLength){ctx.save();ctx.lineWidth=0.5;ctx.strokeStyle='red';// 画underage
    ctx.beginPath();ctx.moveTo(0, minStorage);ctx.lineTo(axisLength, minStorage);ctx.stroke();ctx.closePath();ctx.save();ctx.translate(-10,minStorage);ctx.rotate(getRad(180));ctx.scale(-1,1);ctx.fillText("告罄",0,0);ctx.restore();ctx.restore();ctx.save();ctx.lineWidth=0.5;ctx.strokeStyle='red';// 画underage
    ctx.beginPath();ctx.moveTo(0, maxStorage);ctx.lineTo(axisLength, maxStorage);ctx.stroke();ctx.closePath();ctx.save();ctx.translate(-10,maxStorage);ctx.rotate(getRad(180));ctx.scale(-1,1);ctx.fillText("超储",0,0);ctx.restore();ctx.restore();
}function drawStockCurve(ctx,actualStock,inbounds,outbounds,minStorage,maxStorage){ctx.save();ctx.lineWidth=1;ctx.strokeStyle='black';ctx.fillStyle='black';var y=actualStock;var x;ctx.beginPath();for(var i=0;i<inbounds.length;i++){y=y+inbounds[i]-outbounds[i];x=i*50;ctx.lineTo(x, y);ctx.save();// 因坐标变换会导致文字错位,故采用位移+旋转+缩放的方式恢复
        ctx.translate(x,y);ctx.rotate(getRad(180));ctx.scale(-1,1);ctx.fillText("("+i+","+y+")",0,0);ctx.restore();}ctx.stroke();ctx.closePath();// 2
    y=actualStock;x=0;for(var i=0;i<inbounds.length;i++){y=y+inbounds[i]-outbounds[i];x=i*50;ctx.lineTo(x, y);if(y>maxStorage){ctx.beginPath();ctx.strokeStyle='yellow';ctx.arc(x,y,5,0,Math.PI*2,false);ctx.stroke();ctx.closePath();}if(y<minStorage){ctx.beginPath();ctx.strokeStyle='red';ctx.arc(x,y,3,0,Math.PI*2,false);ctx.stroke();ctx.closePath();}}ctx.restore();
}function drawAxisX(ctx,axisLength){ctx.save();ctx.lineWidth=0.5;ctx.strokeStyle='navy';ctx.fillStyle='navy';// 画轴
    ctx.beginPath();ctx.moveTo(0, 0);ctx.lineTo(axisLength, 0);ctx.stroke();ctx.closePath();ctx.beginPath();ctx.moveTo(axisLength-Math.cos(getRad(15))*10, Math.sin(getRad(15))*10);ctx.lineTo(axisLength, 0);ctx.lineTo(axisLength-Math.cos(getRad(15))*10, -Math.sin(getRad(15))*10);ctx.stroke();ctx.closePath();// 画刻度var x,y;y=5;for(x=50;x<axisLength;x+=50){ctx.beginPath();ctx.moveTo(x, 0);ctx.lineTo(x, y);ctx.stroke();ctx.closePath();}// 写文字var i=0;for(x=0;x<axisLength;x+=50){ctx.save();ctx.scale(1,-1);ctx.fillText(i,x,y+10);ctx.restore();i++;}ctx.restore();
}function drawAxisY(ctx){ctx.save();ctx.lineWidth=0.5;ctx.strokeStyle='navy';ctx.fillStyle='navy';// 画轴
    ctx.beginPath();ctx.moveTo(0, 0);ctx.lineTo(0, 200);ctx.stroke();ctx.closePath();ctx.beginPath();ctx.moveTo(Math.sin(getRad(15))*10, 200-Math.cos(getRad(15))*10);ctx.lineTo(0, 200);ctx.lineTo(-Math.sin(getRad(15))*10, 200-Math.cos(getRad(15))*10);ctx.stroke();ctx.closePath();// 画刻度var x,y;x=5;for(y=50;y<200;y+=50){ctx.beginPath();ctx.moveTo(x, y);ctx.lineTo(0, y);ctx.stroke();ctx.closePath();}// 写文字
    x=-19;for(y=50;y<200;y+=50){ctx.save();ctx.scale(1,-1);ctx.translate(0,-200);ctx.fillText(200-y,x,y);ctx.restore();}ctx.restore();
}function getRad(degree){return degree/180*Math.PI;
}function toCurrency(money) {  if (/[^0-9\.]/.test(money)){return '0.00';}money = money.replace(/^(\d*)$/, "$1.");money = (money + "00").replace(/(\d*\.\d\d)\d*/, "$1");money = money.replace(".", ",");var re = /(\d)(\d{3},)/;while (re.test(money)) {money = money.replace(re, "$1,$2");}money = money.replace(/,(\d\d)$/, ".$1");return '' + money.replace(/^\./, "0.")+" ";
}
//-->
</script>

HTML5 Canvas 绘制库存变化折线 计算出库存周转率相关推荐

  1. HTML5 Canvas 绘制库存变化折线 增加超储告罄线

    <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type&quo ...

  2. h5的横线_使用HTML5 Canvas绘制直线或折线等线条的方法讲解

    HTML5 Canvas基本概念讲解html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏 ...

  3. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  4. 在html画一个自动缩放圆环,使用html5 canvas绘制圆环动效

    最近笔者有个需求,需求内容为:一组文字显示在圆环的周围,用户可添加文字,文字围绕着圆环,每个词对应圆环周围的的蓝色小圆点,当用户鼠标放在圆环上方小蓝点时时,实现放射出三角形,再显示出文字,先看看动图效 ...

  5. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

    HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 原文:HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 看到网上很多展示html5雪花飞动 ...

  6. html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形

    html5: Canvas 绘制基本图形 从绘制直线 到 路径 Jack Lee 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.n ...

  7. html5 canvas绘制图形,html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  8. HTML5 canvas绘制太阳系各行星(包括月球的公转)

    HTML5 canvas绘制太阳系   看了好多canvas绘制太阳系行星,他们都忽略了月亮,虽然月亮不是行星,但是绘图少了月亮也就没有挑战性了,今天我就计算了一下月亮的轨迹,然后按照公转的比例画了上 ...

  9. html5时间画布走动,javascript+HTML5 canvas绘制时钟功能示例

    本文实例讲述了javascript+HTML5 canvas绘制时钟功能.分享给大家供大家参考,具体如下: 效果如下: 代码: www.jb51.net canvas绘制时钟 div{text-ali ...

最新文章

  1. JDK 13 新特性一览
  2. 一禁了之还是放开应用?面部识别“人红是非多”
  3. c#的Marshal
  4. linux开发操作系统,Linux 操作系统应用与开发
  5. 面试: 14 个实用的数据库设计技巧,一次性教给你!
  6. [react-router] React-Router怎么获取历史对象?
  7. python nlp_Python NLP入门教程
  8. 数据结构Java版之基数排序(四)
  9. 用spss做哑变量--给不敲代码同学福音
  10. redis 分布式锁流程图
  11. java spark yarn_java – 是否可以从代码中运行spark yarn cluster?
  12. html 设置字体加粗,css如何设置字体加粗样式?
  13. 杨帅浙江大学计算机,诚邀校友见证杭州校友会注册成立(非活动帖)
  14. 【转】CC2530/2531/2533对比
  15. 华三模拟器中的remote实现简单组网
  16. 出国旅游也能用微信买单了
  17. 网站可行性报告范文_嵩县写可行性研究报告项目报告范文
  18. 边缘计算的100个术语
  19. 2020-10-7 CCNA学习笔记
  20. C#中使用Invalidate()与MouseMove方法刷新控件时,控件闪烁问题解决方法

热门文章

  1. 群辉安装python3,pip,环境变量配置
  2. maven国内镜像--开源中国
  3. 影碟出租管理c语言程序,影碟出租管理系统
  4. matlab人眼识别原理,基于MATLAB的人眼检测.docx
  5. 智慧公路引领时代变革?
  6. vue3使用Pinia进行全局状态管理,Pinia安装和使用,Pinia 和 Vuex的对比
  7. 如何解决c++文件读写流无法读取中文的问题(vc6.0)
  8. Android开发之安全彻底的修改包名
  9. 微信小程序实现跟odoo的交互 使用xmlrpc和jsonrpc 持续更新中。。。
  10. 【题解】vijos1093 文科生的烦恼