#0004:旺财云库存管理系统硬件篇

随着移动终端的普及化,信息的采集和输出变得越来越容易唾手可得。

上一篇中介绍了旺财云库存管理系统的基本功能和定价体系,时隔一个多月,忙着种子用户的一些上线支持,还有软件著作权等。这一篇来介绍一下,想要用起来、用得好软件,还需要哪些必要的硬件支持。

1、智能手机或PDA
目前有安卓端的App,可以提供资料查询、库存查询、代客下单等操作,其实用不到专业的PDA,有个比较新款的1000元以上的安卓手机即可。

2、扫描枪
正常情况下,不需要扫描二维码的,就买个一维的扫描枪足够了,有线的就行,也有WiFi的,需要注意使用距离和信号。

没什么花头,淘宝上一搜一大堆,百元之内

3、标签打印机及标签纸
这个根据行业,普通的标签用热敏打印机就行了,如果是珠宝黄金这种需要打印到银标签,需要碳带的,就必须专业的标签打印机,推荐斑马的。

小巧桌面级、不需要耗材,直接购买热敏标签纸即可

推荐热敏打印机:佳博(Gprinter)GP1324D电子面单条码标签打印机热敏 快递单打印机不干胶二维码,不到400元,京东购买链接:https://item.jd.com/10572982722.html

企业级,工业级,不仅可以打印热敏的,还能热转印

推荐专业打印机:斑马(ZEBRA) ZT210/230 工业级标签机条码打印机 二维码不干胶打印机 ZT210(203dpi无屏 标配),4000元左右,京东购买链接:https://item.jd.com/10117924614.html

各种主流尺寸直接选择,价格低廉,每张1分钱

目前系统默认的标签尺寸有:40*30mm、50*30mm、100*60mm,请购买时参考。

标签购买参考链接:

1、https://item.jd.com/16047939605.html
2、https://item.jd.com/10033808873.html

4、针式打印机及多联单据打印纸
打印机很普通的针式打印机就够了。
打印纸就是常规的多联单,尺寸都是241mm宽度。

淘宝一搜一大堆,价格从500到1800不等,都好用
可根据需要选择整张,半张或三分之一张
一般客户一联、仓库一联、财务留存一联就够了。 根据自己业务需要购买。

购买的话,京东的链接供参考:https://item.jd.com/11880739745.html

规模小的企业,只要投入1500到2000元的硬件,
软件方面,每个账户每天一块钱,每年365元,只需要极少的初期资金投入,就可以拥有一套强大的信息系统支持了。

C#访问SOAP Web Service时500报错后的返回信息获取

调试Infor ERP LN Web Service的时候,你会发现如果调用不成功,返回的Http Header是500,但用SoupUI还是能看到结果返回,是不是很诡异。

因为这个东西,曾浪费了好几天,换了多种方式调用Web Service:引用、静态、动态、HTTP Post都试了。最后用Fiddle监控本地服务,然后开SoupUI代理,获取到下图。

这就造成了当使用HttpWebRequest访问时,不成功就会出现System.Net.WebException: ‘The remote server returned an error: (500) Internal Server Error.’报错(如下图),获取不到结果了。

怎么办呢,这里只能通过获取异常,然后将异常的相应结果返回。

用下面的代码就不论500错误是否发生,都能获取到Web Service返回值的源代码。

            //500 error but get the message
            HttpWebResponse res;
            try
            {
                res = (HttpWebResponse)webRequest.GetResponse();
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;
            }
            StreamReader sr = new StreamReader(res.GetResponseStream() ?? throw new InvalidOperationException(), Encoding.UTF8);
            var result = sr.ReadToEnd();

H5 WebApp禁止Webform页面回发

前一阵写一个H5的WebApp,用得老技术Webform,然后找人封装一下,优化一下WebView等,主要是实现运行于安卓系统的PDA能很方便的查询库存、进行库存的收发操作。

其中有一个扫码查询,允许用户手动输入,针对input textbox做了onchange事件,但是提交就会出现一个页面自动回发的问题。

用了比较原始的方式:

1、先给页面的表单设置DefaultButton(这里设置的是btnSubmit)。作用是:回车时会以该按钮被点击来提交表单进行回发。

<form id="form1" runat="server" defaultbutton="btnSubmit">

2、为btnSubmit设置Enabled=”False”。作用是:回车后发现btnSubmit不能使用,所以这次提交也就不能成功了

3、如果不想看到这个btnSubmit,就加上样式style=” display:none”进行隐

好了看一下截图吧:

H5端软键盘把footer底部导航栏顶上去了怎么解决?

这个问题是WebApp的通病,特别是用了BootStrap的底部导航栏,又用了input选中时自动移到合适位置,避免软键盘覆盖的时候,会特别明显。

网上有不少分享,都是通过js来实现的,因为我是在安卓手机端,试了多个不管用。

比方说这个:

var oHeight = $(document).height(); //浏览器当前的高度 
$(window).resize(function(){//ios软键盘弹出不会触发resize事件
     if($(document).height() < oHeight){
     $("#footer").css("position","static"); }else{
     $("#footer").css("position","absolute"); //adsolute或fixed,看你布局
} }); 

还有这个:

$("body").find("input[type=text]").each(function() {
    $(this).bind('focus', function() {
        $('#footer').css('display', 'none');
    }).bind('blur', function() {
        $('#footer').css({
            'position': 'fixed',
            'bottom': '0'
        });
        var footer = $('#footer');
                    var display = footer.css('display');
                    if (display == 'none') {
                        footer.show();
                    } else {
                        footer.hide();
                    }
    });
});

最终,我把输入框软键盘防覆盖和底部导航软键盘防顶结合在一起,安卓端用起来还不错。

$(function () {
    $('input,textarea').on('focus', function () {
        //立即隐藏
        $('.footer').css('display', 'none');
        var target = this;
        setTimeout(function () {
            target.scrollIntoViewIfNeeded();
            //target.scrollIntoView(true);
            //console.log('scrollIntoViewIfNeeded');
        }, 200);
    });
    $('input,textarea').on('click', function () {
        var target = this;
        setTimeout(function () {
            target.scrollIntoViewIfNeeded();
            //target.scrollIntoView(true);
            //console.log('scrollIntoViewIfNeeded');
        }, 200);
    });
    $('input,textarea').on('blur', function () {
        $('.footer').css({
            'position': 'fixed',
            'bottom': '0'
        });
        var footer = $('.footer');
        var display = footer.css('display');
        if (display === 'none') {
            footer.fadeIn(2000, function () {//fade
                    footer.show();
            });

            //setTimeout(function () {
            //    footer.show();
            //}, 200);
        } else {
            footer.hide();
        }
    });
});

#0003:第一个公开演示-旺财云库存管理系统

趁着元旦放假加上本周末的一点时间,我将《0001:Done is better that perfect,比完美更好的是完成》提到的第2个积累的作品:旺财云库存的演示系统正式发布出来了。

这是一款– 针对中小型企业,特别是有一物一码(一码一物)、批次、质保期、有效期要求的金银珠宝、化妆品和汽配(电机) 等行业 ,也可以用于样品库存管理、备品备件库存管理。

看过我博客的朋友,应该记得我2014年开始为珠宝行业的黄金(素金)电商零售和批发定制过一套旺财珠宝库存管理系统(软件著作权2017SR342261),客户(邻居)用得很满意,现在年销售额都破2个亿了。在经历了旺财备品备件库存管理系统的通用性改造后,2018整年的闲暇时间都在重构,在保持简约、实用的强大库存管理的功能的基础上,针对不同行业设定配置参数,完成从珠宝行业到通用行业的升级。并在数家企业的实际业务中发挥重要作用。

软件的重要特点如下,更多功能亮点后继会逐一介绍:

  1. 支持多公司,多仓库,多库位
  2. 全追溯,序列号,批次号
  3. 双库存单位(特别针对金银贵金属)
  4. 运行于浏览器,客户端免安装
  5. 特别适用一物一码,批次管理,有效期,保质期等要求的行业
  6. 按件扫码盘点
  7. 出库、退货入库扫码操作
  8. 极易扩展为云进销存系统
  9. 可支持手机端经销商下单或手机代客开单

演示网址: http://spwmsdemo.wangcaisoft.com/
无需输入账号密码,直接点击:立即登录即可体验
注意:请勿修改测试密码,谢谢配合

当然了,你也可以在线注册演示账号,用于自己公司的数据测试。试用完毕觉得满意,就可以付费并一键迁移到正式系统。

费用吗,其实定位为中小企业的仓库库存管理系统,分2种模式:

1、按用户、按年收费、公有云:一个用户365/年( 一天一块钱 ),年数据量5万条以内
2、终生买断、私有云:不限用户,3.6万起,技术支持及升级服务费每年3600

收费模式和标准目前为2019年暂行,根据实际运营情况调整。

你要是问我是不是创业了,我说我一直在做,但没有专职创业。不过这个旺财软件是我夫人在专职搞运营,我负责提供技术的支持。

我是如何4个小时搞定一个比赛成绩查询微信端的

我的一个老同事,转行做教育行业,主办了一个省的比赛项目,给我打电话时,比赛刚结束,觉得直接微信公众号发个文章,把参赛选手的成绩放在一个表格里面,比较Low,另外可能有些小的机构组织者自己复制他们的选手成绩,就直接发给选手了,官方的公众号就是失去上千个选手的关注。

老同事开玩笑说发个红包,让我给她搞定,要第二天成绩一出来就能查。

心想有我的旺财C# .NET代码生成器,就一个表的事,80%的代码一键就生成了,剩下10%弄点后台代码,其它的都是前端的美化了。正巧晚上没有电话会议,就一口答应了,可是没想到3个小时居然没搞定。前端美化,特别是弄张顶部的图花费了我不少时间。

废话少说,先上截图吧,不然看文字你会看不下去,看完图,待我慢慢说来。

查询界面

结果页面(iPhone7和iPhone8)

管理员登录

新增及查看页面

老同事的电话上,我让她提供所要显示的成绩信息,就是列一个Excel表,把表头给我。然后告诉我根据什么来查询。

当天拿到的表结构如下:

我新增了3个字段,简单记录一下查询次数、首次查询时间和最近查询时间。

接着用代码生成器一键生成代码:

业务代码:除ScoreManager..Manual.cs文件外,都是自动生成的

Web页面及代码:Exam目录里的全部自动生成的,下面2个Exam.aspx和Score.aspx是手动创建的。

查询成绩的核心代码为复制现成的,手写一部分,如下:

读数据库的,就是纯SQL啦

前端部分,主要就是Exam.aspx和Score.aspx,涉及到一个上面的图,原始图如下,太宽了,得裁剪出来,不然文字都看不清楚,另外底部加点渐变。

功能真得很简单,因为时间紧张,做到这个程度已经让老同事惊讶,当然了第二天做了点文字、标题、数据导入、个别记录的修改,但核心的开发用了晚上的4个小时完成,多亏了不断完善的代码生成器。当然了,很多生成的代码和功能并未用到,特别是各种操作的权限管理、缓存等等。

如果时间来得及,这个比赛成绩查询小系统还可以做得更加完美

比方说:

  1. 记录查询者的IP地址信息,并获知其地理位置、省份城市等信息并保存
  2. 每次查询记录都保存到单独的表
  3. 用户查询时,可以多增加几个查询条件,并后台可以配置,如参赛码、比赛名称(可选)
  4. 管理员后台可以Excel/CSV导入记录
  5. 选手查询成绩后,如果中奖可以提交快递收货信息
  6. 选手查询成绩后,可生成图片转发到朋友圈炫耀等
  7. PC端也做上,特别是UI要针对PC

让高效技术帮助更多人

浪费了1个多小时写这篇文章,其实也没啥技术含量。但这么一个简单的功能,其实很多类似的竞赛、比赛、考试等都可以直接用,对考生、选手、举办方都会受益。

有类似需求的朋友,可以联系我量身定制贵组织的比赛/考试/竞赛成绩查询系统,体验快速、高效的技术服务。

C#中const与readonly区别

近期将旺财代码生成器的Entity代码进行优化,表名和字段名

一句话:const的值是固定的,代码里面写死的,每一次编译后结果都一样,而readonly的值是可以在运行的时候才确定值的。

了解更多:所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值;所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。

有关内存:const修饰的常量没有内存消耗;readonly因为需要保存常量,所以有内存消耗。

Xamarin.Forms扩平台移动开发初体验

近期花了1周时间熟悉和使用Xamarin.Forms进行跨平台开发,本想做一个针对H5 Web的封装,希望在安卓和苹果平台优先使用微信X5内核的浏览器,然后最差也要用Chrome内核的,可惜百度、Google翻墙,QQ群咨询,试了WebView的CustomRender,也尝试了Xamarin.Forms.Essential 的Browser,以失败告终。

不过通过这个实例从零开始研究,倒是发现很多亮点:

1、使用VS2017直接在线安装Xamarin.Forms所必需的开发环境、JDK、安卓模拟器等,无比流畅
2、使用Xamarin.Forms开发同时兼容多个移动平台,这个概念的确很棒,新手上手挺快
3、Xamarin.Forms官方的在线文档和基础视频还算齐备,有一定英文基础的,应该很容易入门。
4、国内的Xamarin.Forms相关QQ群有超过20个活跃的,大群有1000多人,还出现了收费QQ群。
5、国内有人专门制作Xamarin.Forms及相关的培训教材,并在淘宝和QQ群销售,售价也不菲。

ZUI(BootStrap)动态插入HTMl所创建的data-toggle事件初始化方法

这个问题去年碰到过一次,当时没空研究,就跳过去了,换了个方法刷新整个页面。不用你说,我现在也觉得有点傻(当时也觉得)。

这次又碰到类似的,用ZUI(基于BootStrap)的lightbox,动态HTML增加了图片,但是data-toggle=”lightbox”这个事件不生效,点击一下图片直接当前窗口打开图片链接了。其实所有的data-toggle都有一样的问题,就是不生效。

有些人说需要Append相应的HTML后,动态的data-toggle属性设置一下,其实是没用的。

还有人说用全局的delegate,那个小题大做。如果自己写的自定义函数,倒是可以用。

其实很简单,就是Append之后,获取到DOM的元素后,手动激活一下事件。

$(“.cards”).find(‘.card’).eq(0).find(‘a’).eq(0).lightbox();

popover同理:$(“.cards”).find(‘.card’).eq(0).find(‘a’).eq(0).popover();