您好,我是掘金者说,最近有点累主要是没有休息好,直接请年假一天在家睡了一天一夜补眠。然后,假期回老家挖笋顺便和姚总监再聊工作上的事情。上回写的是业务功能的对账,现在来讲下在做业务功能“门面”,系统平台的登录后的首页展示,几乎都是报表、统计、圆饼图、柱状图。采用微服务前后端分离,后端spring cloud,前端使用vue+element ui+echart,前后端都是一个人进行弄。原型图改了第一版,后来又改了一版本,功能又确认了…里面不弄不知道,细碎的东西可真多。前端页面绘制,后端接口编写,数据库语句编写,单元调试…
通俗的讲,业务就是需要处理的各种事务,但是通常偏向指客户实际作业涉及的事务,业务最终的目的是完成工作所做的所有事务。
软件是用来解决现实世界中的业务给人们的工作带来便利的。技术是为了解决业务的问题,只有在实现业务给人们带来便利的前提下,技术的存在才有意义。所以,多数时候是业务决定技术,业务统领技术。没有技术,业务就无法被虚拟化,生产效率就很难有效提升,业务和技术具有相互促进、相互依赖、相互共存的关系。我们都看过周星驰的电影《喜剧之王》有一句台词这么说的:其实,我是一个演员。作为我们来说:其实,我是一个程序员。 一个道理。我们回到开发者身上来看,写业务代码多一些,还是所谓的技术代码多一些,没有高低之分,只有个人取向和组织分工的不同。
很多开发者会用不同的眼光来看待业务和技术,比如把增删改查(CRUD)看作是无意义的业务代码(其实,可以使用代码生成器,来实现前端+后端+数据库脚本生成,具体可以参考pig4cloud,把实现 MQ 或 Redis 这样的框架看作是有技术含量的事情。实际上,所谓的业务代码和技术代码只是距离远近,业务代码距离业务更近,技术代码离业务稍远,他们最终都是指向业务实现的。每一层技术实现都是服务于上一层的需求为业务。现实中,业务在被我们虚拟化的过程中,会在技术实现角度引发分层,产生组件模块化。这样让开发者觉得技术实现越来越业务没有技术含金量?面试的时候被问道多线程、高可用、高并发、高性能、某实现原理和机制、遇到难点和解决方法思路等等,导致概括能力和实战运用退化,这个需要平时多训练和琢磨。 当我们越是接近用户业务,会发现里面的细节越多,繁琐度越高,越不容易做的好,越容易遐思而被否定,让人觉得自己的劳动没有价值。遐思性越强,变化几率越高,来来回回频繁的修改代码,正所谓:牵一发,动全身。让人觉得自己的掌控能力低,实现的代码可迁移性越差,个人的劳动成果被能力复用的概率越低。
好了,这些话不是我想多说的,我摊牌了,具体想看直接知乎对开发来讲,业务重要还是技术重要 。现在,讲述一个首页“门面”代码实现记录。
Java核心逻辑,数据统计根据按时/天/周/月/年补全某一段时间的数据。情况是这样的,数据库查询的数据统计,使用sql语句查询group by create_time
之后有部分时间的数据没有,希望通过补充0提供给前端展示。
/** * 按年补全数据-具体逻辑 * * @param oldList * @param start * @param end * @return */
public static List<Map<String, String>> addYearForNullMap(List<Map<String, String>> oldList, String start, String end) {
int n = getYearSub(start, end) + 1;
ArrayList<Map<String, String>> newList = new ArrayList<>();
int num = oldList.size();
int temp = 0;
Date startDate = DateUtil.parse(start, "yyyy");
Date endDate = DateUtil.parse(end, "yyyy");
Date tmpDate = null;
if (startDate == null || endDate == null) {
return newList;
}
for (int i = 0; i < n; i++) {
if (temp < num) {
String orderTime = ObjectUtil.toString(oldList.get(temp).get("orderTime"));
tmpDate = DateUtil.parse(orderTime, "yyyy");
//如果开始日期小于当前记录日期则增加空白数据
if (startDate.compareTo(tmpDate) < 0) {
Map<String, String> result = getNewStatisticResultMap(start);
newList.add(result);
}
if (startDate.compareTo(tmpDate) == 0) {
//原数据加入
newList.add(oldList.get(temp));
temp++;
}
} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
//加入空数据直到结束时间
Map<String, String> result = getNewStatisticResultMap(start);
newList.add(result);
}
//开始时间向前加一年
startDate = addDateOneYear(startDate);
start = DateUtil.format(startDate, "yyyy");
}
return newList;
}
/** * 按日补全数据-具体逻辑 * * @param oldList * @param start * @param end * @return */
public static List<Map<String, String>> addDayForNullMap(List<Map<String, String>> oldList, String start, String end) {
long n = getDaySub(start, end) + 1;
ArrayList<Map<String, String>> newList = new ArrayList<>();
int num = oldList.size();
int temp = 0;
Date startDate = DateUtil.parse(start, "yyyy-MM-dd");
Date endDate = DateUtil.parse(end, "yyyy-MM-dd");
Date tmpDate = null;
if (startDate == null || endDate == null) {
return newList;
}
for (int i = 0; i < n; i++) {
if (temp < num) {
tmpDate = stringToDate(ObjectUtil.toString(oldList.get(temp).get("orderTime")), "yyyy-MM-dd");
//如果开始日期小于当前记录日期则增加空白数据
if (startDate.compareTo(tmpDate) < 0) {
Map<String, String> result = getNewStatisticResultMap(start);
newList.add(result);
}
if (startDate.compareTo(tmpDate) == 0) {
//原数据加入
newList.add(oldList.get(temp));
temp++;
}
} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
//加入空数据直到结束时间
Map<String, String> result = getNewStatisticResultMap(start);
newList.add(result);
}
//开始时间向前加一天
startDate = addDateOneDay(startDate);
start = DateUtil.format(startDate, "yyyy-MM-dd");
}
return newList;
}
或者
/** * 按日补全数据-具体逻辑 * * @param oldList * @param start * @param end * @return */
public static List<StatisticResult> addDayForNull(List<StatisticResult> oldList, String start, String end) {
long n = getDaySub(start, end) + 1;
ArrayList<StatisticResult> newList = new ArrayList<>();
int num = oldList.size();
int temp = 0;
Date startDate = DateUtil.parse(start, "yyyy-MM-dd");
Date endDate = DateUtil.parse(end, "yyyy-MM-dd");
Date tmpDate = null;
if (startDate == null || endDate == null) {
return newList;
}
StatisticResult dog = null;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < n; i++) {
if (temp < num) {
tmpDate = DateUtil.parse(ObjectUtil.toString(oldList.get(temp).getTime()), "yyyy-MM-dd");
//如果开始日期小于当前记录日期则增加空白数据
if (startDate.compareTo(tmpDate) < 0) {
StatisticResult result = getNewStatisticResult(start);
newList.add(result);
}
if (startDate.compareTo(tmpDate) == 0) {
//原数据加入
newList.add(oldList.get(temp));
temp++;
}
} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
//加入空数据直到结束时间
StatisticResult result = getNewStatisticResult(start);
newList.add(result);
}
//开始时间向前加一天
startDate = addDateOneDay(startDate);
start = DateUtil.format(startDate, "yyyy-MM-dd");
}
return newList;
}
/** * 根据开始与结束日期获取相减得到的天数 * * @param beginDateStr * @param endDateStr * @return */
public static long getDaySub(String beginDateStr, String endDateStr) {
long day = 0;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate;
Date endDate;
try {
beginDate = format.parse(beginDateStr);
endDate = format.parse(endDateStr);
day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
} catch (ParseException e) {
e.printStackTrace();
}
return day;
}
/** * 根据开始与结束日期获取相减得到的年数 * * @param beginDateStr * @param endDateStr * @return */
public static int getYearSub(String beginDateStr, String endDateStr) {
int year = 0;
SimpleDateFormat format = new SimpleDateFormat("yyyy");
Date beginDate, endDate;
try {
beginDate = format.parse(beginDateStr);
endDate = format.parse(endDateStr);
Calendar calendarBegin = new GregorianCalendar();
Calendar calendarEnd = new GregorianCalendar();
calendarBegin.setTime(beginDate);
calendarEnd.setTime(endDate);
int yearBegin = calendarBegin.get(Calendar.YEAR);
int yearEnd = calendarEnd.get(Calendar.YEAR);
year = (yearEnd - yearBegin) ;
} catch (ParseException e) {
e.printStackTrace();
}
return year;
}
@Test
public void addMonthsForNull() {
List<StatisticResult> oldList = new ArrayList<>();
StatisticResult st1 = new StatisticResult();
StatisticResult st2 = new StatisticResult();
st1.setAction("55");
st1.setTime("2020-01-02");
st2.setAction("66");
st2.setTime("2020-01-03");
oldList.add(st1);
oldList.add(st2);
String start = "2020-01-01";
String end = "2020-01-05";
TheFirstStatisticsUtil tt = new TheFirstStatisticsUtil();
List<StatisticResult> list = tt.addDayForNull(oldList, start, end);
for (StatisticResult sr : list) {
System.out.println(sr.toString());
}
}
StatisticResult(time=2020-01-01, action=0)
StatisticResult(time=2020-01-02, action=55)
StatisticResult(time=2020-01-03, action=66)
StatisticResult(time=2020-01-04, action=0)
StatisticResult(time=2020-01-05, action=0)
下一篇,介绍前端vue编写的技巧方式,现在就写到这吧。