79077725222d514c884786a7d77c9bbc0c892290.svn-base 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package com.iamberry.app.service;
  2. import java.util.ArrayList;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.IdentityHashMap;
  6. import java.util.LinkedHashMap;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import org.apache.commons.lang3.math.NumberUtils;
  11. import org.joda.time.DateTime;
  12. import org.springframework.stereotype.Service;
  13. import com.iamberry.app.config.Constants;
  14. import com.iamberry.app.core.dto.MilkInfoDTO;
  15. import com.iamberry.app.core.dto.RecordCountInfoDTO;
  16. import com.iamberry.app.core.dto.RecordDTO;
  17. import com.iamberry.app.core.entity.MilkDatetimeValue;
  18. import com.iamberry.app.core.entity.MilkImages;
  19. import com.iamberry.app.core.entity.MilkMakingRecord;
  20. import com.iamberry.app.core.entity.MilkPowderInfo;
  21. import com.iamberry.app.core.entity.User;
  22. import com.iamberry.app.face.MilkService;
  23. import com.iamberry.app.ulitity.Utility;
  24. import com.iamberry.wechat.tools.DateTimeUtil;
  25. /**
  26. * MilkService
  27. *
  28. * @author Moon Cheng
  29. * @date 2016年3月23日 上午11:33:10
  30. */
  31. @Service
  32. public class MilkServiceImpl extends BaseService implements MilkService {
  33. /**
  34. * setMilkMakingRecord
  35. * @param makingRecord
  36. * @param token
  37. * @param recordId
  38. * @return
  39. */
  40. public MilkMakingRecord setMilkMakingRecord(MilkMakingRecord makingRecord, String token) {
  41. User userInfo = validateUserToken(token);
  42. if (userInfo == null) {
  43. return null;
  44. }
  45. makingRecord.setUser(userInfo.getId());
  46. makingRecord.setTimestamp_(new Date());
  47. milkMapper.insertMilkMakingRecord(makingRecord);
  48. return makingRecord;
  49. }
  50. /**
  51. * searchUserRecordsBytime
  52. *
  53. * @author Moon Cheng
  54. * @param userId
  55. * @param startTime
  56. * @param endTime
  57. * @return Milk Making Record List
  58. */
  59. public Map<String, List<RecordDTO>> searchUserRecordsByTime(Long userId, String dateStatus, String chosenDate,
  60. String machineMac) {
  61. Map<String, List<RecordDTO>> recordInfos = new LinkedHashMap<String, List<RecordDTO>>();
  62. String dateType = null, formatter = null;
  63. Calendar calendar = Calendar.getInstance();
  64. if (chosenDate != null) {
  65. // calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd
  66. // HH:mm:ss", chosenDate));
  67. // 防止无数据时显示分钟错误
  68. chosenDate = chosenDate.substring(0, chosenDate.length() - 6) + ":00:00";
  69. calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
  70. } else {
  71. calendar.setTime(new Date());
  72. }
  73. Date start = null, end = null;
  74. switch (dateStatus) {
  75. case "day":
  76. dateType = "days";
  77. formatter = "%Y%m%d%H";
  78. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
  79. 0);
  80. start = calendar.getTime();
  81. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
  82. 59, 59);
  83. end = calendar.getTime();
  84. recordInfos.put("app", Utility.convertMap(
  85. milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
  86. dateType));
  87. recordInfos.put("machine", Utility.convertMap(
  88. milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
  89. dateType));
  90. break;
  91. case "week":
  92. dateType = "weeks";
  93. formatter = "%Y%m%d";
  94. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
  95. 0);
  96. calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
  97. start = calendar.getTime();
  98. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
  99. 59, 59);
  100. if (Calendar.SUNDAY < Calendar.MONDAY) {
  101. calendar.add(Calendar.DATE, 7);
  102. }
  103. calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
  104. end = calendar.getTime();
  105. recordInfos.put("app", Utility.convertMap(
  106. milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
  107. dateType));
  108. recordInfos.put("machine", Utility.convertMap(
  109. milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
  110. dateType));
  111. break;
  112. case "year":
  113. dateType = "years";
  114. formatter = "%Y%m";
  115. calendar.set(calendar.get(Calendar.YEAR), 0, 1, 0, 0, 0);
  116. start = calendar.getTime();
  117. calendar.set(calendar.get(Calendar.YEAR), 11, 31, 23, 59, 59);
  118. end = calendar.getTime();
  119. recordInfos.put("app", Utility.convertMap(
  120. milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
  121. dateType));
  122. recordInfos.put("machine", Utility.convertMap(
  123. milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
  124. dateType));
  125. break;
  126. }
  127. return Utility.fillAppMachineRecordWithZero(Utility.synAppMachineRecord(recordInfos), dateType, chosenDate);
  128. }
  129. /**
  130. * searchUserRecordById
  131. *
  132. * @author Moon Cheng
  133. * @param recordId
  134. * @return Milk Making Record Information
  135. */
  136. public MilkMakingRecord searchUserRecordById(Long recordId) {
  137. MilkMakingRecord makingRecord = milkMapper.selectMilkMakingRecord(recordId);
  138. return makingRecord;
  139. }
  140. /**
  141. * 根据用户,获取冲奶记录的-->总量和次数
  142. *
  143. * @author Moon Cheng
  144. * @param userId
  145. * @return
  146. */
  147. public RecordCountInfoDTO getTotalMilkVolumeMadeByUser(Long userId) {
  148. RecordCountInfoDTO recordcount = milkMapper.getMilkPowderSumByUser(userId);
  149. return recordcount;
  150. }
  151. /**
  152. * setMilkPowderInfo
  153. *
  154. * @author Moon Cheng
  155. * @param entity
  156. * @param token
  157. * @return Milk Powder Information
  158. */
  159. public MilkPowderInfo setMilkPowderInfo(MilkPowderInfo entity, String token) {
  160. User userInfo = validateUserToken(token);
  161. if (userInfo == null) {
  162. return null;
  163. }
  164. // change status as user's phone number
  165. entity.setStatus_(
  166. userInfo.getUsername().length() > 11 ? Constants.MILK_POWDER_NOT_APPROVED : userInfo.getUsername());
  167. entity.setCreated_on(new Date());
  168. milkMapper.insertMilkPowderInfo(entity);
  169. return entity;
  170. }
  171. /**
  172. * searchMilkPowderInfoByBarCode
  173. *
  174. * @author Moon Cheng
  175. * @param barcode
  176. * @return Milk Powder Information
  177. */
  178. public MilkPowderInfo searchMilkPowderInfoByBarCode(String barcode) {
  179. MilkPowderInfo milkPowderInfo = milkMapper.selectMilkPowderInfo(barcode);
  180. return milkPowderInfo;
  181. }
  182. /**
  183. *
  184. * 通过品牌名获取奶粉信息
  185. * @author Moon Cheng, Yin
  186. * @param brand
  187. * @return Milk Powder List
  188. */
  189. public Map<String, List<String>> searchMilkPowderInfosByBrand(String brand) {
  190. brand = "%" + brand.trim() + "%";
  191. Map<String, List<String>> infos = new IdentityHashMap<String, List<String>>();
  192. List<MilkInfoDTO> milkInfo = milkMapper.selectMilkInfoBybrand(brand);
  193. for (int i = 0; i < milkInfo.size(); i++) {
  194. List<String> list = new LinkedList<String>();
  195. list.add(milkInfo.get(i).getLevel() + ":" + milkInfo.get(i).getType() + ":"
  196. + milkInfo.get(i).getPowder_ratio() + ":" + milkInfo.get(i).getId() + ":"
  197. + milkInfo.get(i).getWeight_per_spoon());
  198. infos.put(milkInfo.get(i).getSeries(),list);
  199. }
  200. return infos;
  201. }
  202. /**
  203. * searchMilkPowderBrand
  204. *
  205. * @return Brand List
  206. */
  207. public List<String> searchMilkPowderBrand() {
  208. List<String> milkPowderInfos = milkMapper.selectMilkPowderBrand();
  209. List<String> result = new ArrayList<>();
  210. milkPowderInfos.forEach(milk -> {
  211. if (NumberUtils.isNumber(milk) && milk.contains(".")) {
  212. milk = milk.substring(0, milk.indexOf("."));
  213. }
  214. result.add(milk);
  215. });
  216. return result;
  217. }
  218. /**
  219. * searchMilkInfoByBrandSeriesLevel
  220. *
  221. * @param brand
  222. * @param series
  223. * @param level
  224. * @return
  225. */
  226. public MilkPowderInfo searchMilkInfoByBrandSeriesLevel(String brand, String series, String level) {
  227. return milkMapper.selectMilkInfoByBrandSeriesLevel(brand, series, level);
  228. }
  229. // =====================================TuyaHistoryData======================================
  230. /**
  231. * getLastRecordDate
  232. *
  233. * @return
  234. */
  235. public Date getLastRecordDate() {
  236. Date lastDate = milkMapper.selectLastRecordDate();
  237. return lastDate == null ? new Date() : lastDate;
  238. }
  239. /**
  240. * addRecordData
  241. * @param devId
  242. * @param value
  243. * @param time
  244. */
  245. public void addRecordData(String devId, String value, Long time, Long userId) {
  246. MilkMakingRecord milkMakingRecord = new MilkMakingRecord();
  247. milkMakingRecord.setVolume(Integer.parseInt(value));
  248. milkMakingRecord.setMachine(devId);
  249. milkMakingRecord.setTimestamp_(new Date(time));
  250. milkMakingRecord.setUser(userId);
  251. milkMapper.insertRecordData(milkMakingRecord);
  252. }
  253. @Override
  254. public void setMilkImages(MilkImages images) {
  255. // TODO Auto-generated method stub
  256. milkMapper.insertMilkImages(images);
  257. }
  258. @Override
  259. public List<MilkDatetimeValue> getMilkRecordByTime(String mac, String date) {
  260. // TODO Auto-generated method stub
  261. // 处理搜索的时间
  262. date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM-dd"));
  263. // 获取时间区间
  264. Date startDate = DateTimeUtil.parse(date, "yyyy-MM-dd");
  265. Calendar calendar = Calendar.getInstance();
  266. calendar.setTime(startDate);
  267. calendar.set(Calendar.HOUR_OF_DAY, 24);
  268. // 获取
  269. List<MilkDatetimeValue> list = milkMapper.getMilkRecordByTime(mac, startDate, calendar.getTime());
  270. return list;
  271. }
  272. @Override
  273. public List<MilkDatetimeValue> getMilkRecordByDate(String mac, String date) {
  274. // 处理搜索的时间
  275. date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM"));
  276. // 判断统计单位:年份或者是月
  277. boolean isYear = false;
  278. if (date.indexOf("-") == -1) {
  279. isYear = true;
  280. }
  281. // year = true 表示统计年份,false : 表示统计月
  282. final boolean year = isYear;
  283. // 返回的数据格式
  284. String dateFormat = year ? "yyyy-MM" : "yyyy-MM-dd";
  285. // 获取时间区间
  286. Date startDate = year ? DateTimeUtil.parse(date, "yyyy") : DateTimeUtil.parse(date, "yyyy-MM");
  287. Date endDate = getLastDayOfYear(startDate, year);
  288. // 查询数据
  289. List<MilkDatetimeValue> values = milkMapper.getMilkRecordByDate(year, mac, startDate, endDate);
  290. // 如果为空需要填充数据到8条
  291. if (values == null || values.size() <= 0) {
  292. values = new ArrayList<MilkDatetimeValue>();
  293. Date tempDate = startDate;
  294. for (int i = 0; i < 8; i++) {
  295. values.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
  296. tempDate = getDate(tempDate, year);
  297. }
  298. return values;
  299. }
  300. // 创建返回对象
  301. List<MilkDatetimeValue> returnValues = new ArrayList<MilkDatetimeValue>(year ? 12 : 31);
  302. // 当前已经填充的时间
  303. Date paddDate = null;
  304. for (int i = 0; i < values.size(); i++) {
  305. // 获取当前迭代的数据,如果为空,那么跳过
  306. MilkDatetimeValue milkDatetimeValue = values.get(i);
  307. if (milkDatetimeValue == null || milkDatetimeValue.getDateTime() == null) {
  308. continue;
  309. }
  310. // 获取当前时间
  311. Date temp = DateTimeUtil.parse(milkDatetimeValue.getDateTime(), dateFormat);
  312. // 填充
  313. paddDate = padding(temp, returnValues, year, paddDate, milkDatetimeValue);
  314. }
  315. // 保证返回数据为8条,可能还需要填充
  316. if (returnValues.size() <= 8) {
  317. int count = 8 - returnValues.size();
  318. Date tempDate = DateTimeUtil.parse(returnValues.get(returnValues.size() - 1).getDateTime(), dateFormat);
  319. for (int i = 0; i < count; i++) {
  320. tempDate = getAddDate(tempDate, year);
  321. returnValues.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
  322. }
  323. }
  324. // 返回
  325. return returnValues;
  326. }
  327. /**
  328. * 填充数据方法
  329. * @param dateYear
  330. * @param values
  331. * @param isYear
  332. * @author 献
  333. * @Time 2016年12月12日
  334. */
  335. public static Date padding(Date dateYear, List<MilkDatetimeValue> values, final boolean isYear, Date paddDate, MilkDatetimeValue milkDatetimeValue) {
  336. // 填充的原则是,如果已经填充过的时间为空,表示可以填充;
  337. // 如果需要填充的时间大于已经填充的时间,表示可以填充
  338. if (paddDate == null || dateYear.getTime() > paddDate.getTime()) {
  339. // next
  340. Date nextDate = getUpDate(dateYear, isYear);
  341. if (nextDate != null) {
  342. padding(nextDate, values, isYear, paddDate, null);
  343. }
  344. // add Data
  345. MilkDatetimeValue datetimeValue = new MilkDatetimeValue();
  346. datetimeValue.setDateTime(DateTimeUtil.format(dateYear, isYear ? "yyyy-MM" : "yyyy-MM-dd"));
  347. datetimeValue.setValue(milkDatetimeValue == null ? 0 : milkDatetimeValue.getValue());
  348. values.add(datetimeValue);
  349. // 替换已经填充过的时间
  350. paddDate = dateYear;
  351. }
  352. return paddDate;
  353. }
  354. /**
  355. * 根据当前时间,获取上一个记录的时间
  356. * @param date
  357. * @param isYear
  358. * @return
  359. * @author 献
  360. * @Time 2016年12月12日
  361. */
  362. public static Date getUpDate(Date date, final boolean isYear) {
  363. Calendar cal = Calendar.getInstance();
  364. cal.setTime(date);
  365. if (isYear) {
  366. // 如果当前月份为1月,那么,不需要处理啦,应该跳过
  367. if (cal.get(Calendar.MONTH) == 0) {
  368. return null;
  369. }
  370. cal.add(Calendar.MONTH, -1);
  371. } else {
  372. // 如果当前天为1日,那么,不需要处理啦,应该跳过
  373. if (cal.get(Calendar.DAY_OF_MONTH) <= 1) {
  374. return null;
  375. }
  376. cal.add(Calendar.DAY_OF_MONTH, -1);
  377. }
  378. return cal.getTime();
  379. }
  380. public static Date getDate(Date date, final boolean isYear) {
  381. Calendar cal = Calendar.getInstance();
  382. cal.setTime(date);
  383. if (isYear) {
  384. cal.add(Calendar.MONTH, -1);
  385. } else {
  386. cal.add(Calendar.DAY_OF_MONTH, -1);
  387. }
  388. return cal.getTime();
  389. }
  390. public static Date getAddDate(Date date, final boolean isYear) {
  391. Calendar cal = Calendar.getInstance();
  392. cal.setTime(date);
  393. if (isYear) {
  394. cal.add(Calendar.MONTH, +1);
  395. } else {
  396. cal.add(Calendar.DAY_OF_MONTH, +1);
  397. }
  398. return cal.getTime();
  399. }
  400. /**
  401. * 根据一个数据获取对应的结束时间,如果是年,获取本年最后一个月的最后一天
  402. * @param date
  403. * @param year
  404. * @return
  405. * @author 献
  406. * @Time 2016年12月12日
  407. */
  408. public static Date getLastDayOfYear(Date date, boolean year) {
  409. Calendar cal = Calendar.getInstance();
  410. cal.setTime(date);
  411. cal.set(Calendar.HOUR_OF_DAY, 24);
  412. cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
  413. if (year) {
  414. cal.set(Calendar.MONTH, cal.getActualMaximum(Calendar.MONTH));
  415. }
  416. return cal.getTime();
  417. }
  418. }