Java 运算符
什么是运算符
如果你学过数学;那么我相信 1+1=2 肯定是知道的。而这个加号的意义就是运算符你肯定也是知道的。简单的来说编程中的
运算符同理。只是可能会比简单的加减乘除稍微的复杂一点点。
如果你学过数学;那么我相信 1+1=2 肯定是知道的。而这个加号的意义就是运算符你肯定也是知道的。简单的来说编程中的
运算符同理。只是可能会比简单的加减乘除稍微的复杂一点点。
想要弄清楚ERP的真正意思,光看概念是远远不够的,我们先来举个例子:
没有ERP的时候,如果客户打来了电话表示对库存当前数据有疑问,要求核查数据,业务人员只能拿着合同到处跑,必须将采
购部、生产部、销售部调查个遍才能发现问题,搜集数据,解决问题,效率低下。有了ERP后,所有的流程、文档、事务都可以在线
上,取代了之前的线下文档,可以直接调取ERP系统中的库存数据与客户及时核对。公司ERP系统贯穿整个业务流程,业务人员再也不
用东跑西跑,手机或电脑上就能与各部门数据互联互通。由此可见,有了ERP系统之后,所有的业务数据都可以在线上找到,做到了
对企业人、财、物的管控。这也就是ERP的具体意思,ERP是Enterprise Resource Planning(企业资源计划)的简称。
作者:CRM卡老师
链接:https://www.zhihu.com/question/394055620/answer/2196649141
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Github 地址: https://github.com/zifeiniu/YinHaiYiBaoCSharpAPI
C#Model封装 银海医保的接口
介绍
银海医保的接口我就不说了,很多家医院在用,但是网上资料不多,接口通过COM组件调用。官方示例有VB,delphi,PB。
我们的HIS是B/S 程序,不能直接调用,所以通过此程序封装银海接口后,通过此程序调用。
当前程序是一个Asp.net mvc web api selfhost 做成一个桌面服务端,封装银海接口,浏览器通过使用JavaScript 请求调用。当然你也可以直接引用DLL,调用方法。
.NET 调用COM 组件示例:
COM 组件调用方式如下:
int Appcode = -1;
msg = string.Empty;
object[] args = new object[] { Appcode, msg };
yhObject = System.Activator.CreateInstance(yh);
ParameterModifier pm = new ParameterModifier(2);
pm[0] = true;
pm[1] = true;
ParameterModifier[] pmd = { pm };
yh.InvokeMember("yh_interface_init", BindingFlags.InvokeMethod, null,
yhObject, args, pmd, System.Globalization.CultureInfo.CurrentCulture, null);
string o1 = args[0].ToString();
string o2 = args[1].ToString();
复制
项目特点
银行的接口是通过组装XML来调用,而且xml都是这种prm_xxx 神奇的数字节点。。
我使用特性封装Model,调用方屏蔽掉xml中prm_xxx 这种神奇的数字,直接使用中文属性。
(使用中文Model当然也有缺点,只不过是我懒得封装上百个Model。直接使用代码生成器生成Model)
这样如果需要添加一个新的接口,可以在两分钟之内搞定。(只需要一键生成Model)
项目添加Mock方式,可以在没有环境的情况下模拟假数据。
也添加了测试环境,及Dump文件及日志等。直接使用dump的json重现错误。
不吹了。。
已知的坑
银海某些接口是返回的使用/t分隔的文本文件的,居然没有表头。我这边解析是通过反射解析,所以要注意model属性声明的顺序就是解析文本文件的顺序。。。顺序千万不能乱。
此项目主要是通过反射赋值,其实效率并不慢。当然你可以去优化了。。
不同的医保政策使用同一个接口,同一个model时,可能再不同的政策下,屏蔽某些属性。
这个只要在反射的时候过滤下就行,这个我还没做。因为我的项目所在医院目前只开了两个政策。
背景
在B端场景下,有的时候我们的客户并不具备自己开发软件的能力,那么SaaS平台应运而生,客户只需要在我们的平台上开通服务,就可以为客户生成出相应的产品。
在网页端很容易,例如淘宝店铺,用户只需要在淘宝网页注册卖家,简单装修一番,也可以做一些简单的二次开发就完成开店,而不需要自己去从0开发,去买服务器,建数据库等等。那么如果想要做一款微信小程序的SaaS平台呢,那么本篇文章主要介绍如何构建微信小程序的SaaS平台,希望对做这块业务的人有所帮助。
微信小程序
微信小程序我理解是一个运行在微信app上的一个webview,一个小程序页面由4个文件组成,分别是:js(页面逻辑)、wxml(页面结构)、json(页面配置)、wxss(页面样式)。和网页的组成一模一样,wxml->html,wxss->css。
构建SaaS平台
微信开放平台提供了第三方平台的功能,可以让企业去构建自己的SaaS功能,第三方平台是什么,他提供了我们代用户实现小程序的能力,这也为我们开发SaaS平台打下了基础。接下来介绍比较重要的步骤。
既然是SaaS平台,我们就要开发一个通用的模板代码(默认的),可以是多套供用户选择,并且在一定程度上可以让用户定制化页面,比如调整位置、修改图片等等。开发完成后可上传至微信小程序模板库
获取预授权码,并在web页面设置入口,引导用户进入授权界面,将小程序的开发、发布等权限授权给我们,以便我们来代用户实现小程序功能。
由于微信接口都是需要令牌的,所以我们需要保存用户授权后的信息,比如小程序id,后续调用接口需要用到。这里不同于个人小程序,第三方平台获取令牌的时候不需要scret,需要第三方平台自己的id、第三方平台的令牌、授权方小程序的id。就可获取令牌调用接口
其他的功能就不赘述,这里只说比较重要的功能。
第一、类目管理 这个是小程序能不能过审的关键信息,类目需要和小程序提供的内容匹配。不然过不了审核。
第二、代码管理 主要分为代码上传、提交审核、接收小程序审核结果推送、发布小程序、线上可见等功能。(1)代码上传,第三方平台从模板库中选择模板上传代码 (2)提交审核,第三方平台替客户提交小程序至微信审核 (3)接收小程序审核结果推送,成功则可以继续下边的流程,如果失败,则需要根据失败原因做相应调整,再提交审核,(4)对审核通过的小程序进行发布 (5)发布成功后修改线上可见。至此整个代码提交发布的流程就结束了。其他功能:如灰度发布、版本回退、审核撤回等功能请参展第三方平台文档。
整体流程图如下:
例如 :
List<obj1> obj1List ,List<obj2> obj2List,需要按照obj1.id=obj2.id进行整合
select * from obj1List left join obj2List on obj1.id=obj2.id
第一步:将obj1List转换成map
将list转成id为key,obj1为value的map对象
public static <K, V> Map<K, V> listToMap(List<V> list, String keyMethodName, Class<V> c) {
Map<K, V> map = new HashMap<K, V>();
if (list != null) {
try {
Method methodGetKey = c.getMethod(keyMethodName);
for (int i = 0; i < list.size(); i++) {
V value = list.get(i);
@SuppressWarnings("unchecked")
K key = (K) methodGetKey.invoke(list.get(i));
map.put(key, value);
}
} catch (Exception e) {
throw new IllegalArgumentException("field can't match the key!");
}
}
return map;
}
第二步:根据key值将obj2List进行copy
for (Obj2 obj: obj2List) {
try {
System.out.println(obj);
BeanUtils.copyProperties(mapFromList1.get(obj.getId()), obj);
} catch (Exception e) {
e.printStackTrace();
}
}
另一个例子:
java代码
public class TEST {
public static void main(String[] args) {
List<Model1> list1 = new ArrayList();
List<Model1> list2 = new ArrayList();
List<Model2> list3= new ArrayList();
for (int i=0;i<list1.size();i++){
for (int j=0;j< list2.size();j++){
//判断两个集合no是否相等
if (list1.get(i).getNo()==list2.get(i).getNo()){
//给第三个集合赋值并计算different
Model2 model2=new Model2();
model2.setName(list1.get(i).getName());
model2.setNo(list1.get(i).getNo());
model2.setDifferent(list1.get(i).getName()-list2.get(i).getName());
list3.add(model2);
}
}
}
System.out.println(list3);
}
private static class Model2 {
Integer no;
Integer name;
Integer different;
public Integer getNo() {
return no;
}
public void setNo(Integer no) {
this.no = no;
}
public Integer getName() {
return name;
}
public void setName(Integer name) {
this.name = name;
}
public Integer getDifferent() {
return different;
}
public void setDifferent(Integer different) {
this.different = different;
}
}
private static class Model1 {
Integer no;
Integer name;
public Integer getNo() {
return no;
}
public void setNo(Integer no) {
this.no = no;
}
public Integer getName() {
return name;
}
public void setName(Integer name) {
this.name = name;
}
}
}