Parcourir la source

app代码提交

liujiankang il y a 7 ans
Parent
commit
e386f308d3
100 fichiers modifiés avec 11306 ajouts et 0 suppressions
  1. 38 0
      iamberry-app-service/.classpath
  2. 36 0
      iamberry-app-service/.project
  3. 6 0
      iamberry-app-service/.settings/org.eclipse.core.resources.prefs
  4. 13 0
      iamberry-app-service/.settings/org.eclipse.jdt.core.prefs
  5. 4 0
      iamberry-app-service/.settings/org.eclipse.m2e.core.prefs
  6. 6 0
      iamberry-app-service/.settings/org.eclipse.wst.common.component
  7. 5 0
      iamberry-app-service/.settings/org.eclipse.wst.common.project.facet.core.xml
  8. 2 0
      iamberry-app-service/.settings/org.eclipse.wst.validation.prefs
  9. 1 0
      iamberry-app-service/.svn/entries
  10. 1 0
      iamberry-app-service/.svn/format
  11. 274 0
      iamberry-app-service/.svn/pristine/03/03fd8050edaa8cd7d94adc28309c9734d57eaa8a.svn-base
  12. 59 0
      iamberry-app-service/.svn/pristine/07/078a7123ffa60f37a3b34e46282d76040fb1efcf.svn-base
  13. 35 0
      iamberry-app-service/.svn/pristine/07/07e4798d1c60d2e0b2cc2201a96847e86753f88b.svn-base
  14. 151 0
      iamberry-app-service/.svn/pristine/0f/0fb21d45360680afecbbd13f76c30b3be799a577.svn-base
  15. 76 0
      iamberry-app-service/.svn/pristine/14/14c97ecad830290fee1955c6a5adbbd11a3642cf.svn-base
  16. 189 0
      iamberry-app-service/.svn/pristine/16/167b6f94f00b1c53d68e86bcf1ff466153459f17.svn-base
  17. 209 0
      iamberry-app-service/.svn/pristine/1f/1ff8519924b79f823f3dd8265176912dc799f4da.svn-base
  18. 49 0
      iamberry-app-service/.svn/pristine/2b/2bba3a4dbd00217561718d7077c9e15a6d6d1ad3.svn-base
  19. 235 0
      iamberry-app-service/.svn/pristine/32/32ad929fdffcdec789274929c308c99854de7ff0.svn-base
  20. 34 0
      iamberry-app-service/.svn/pristine/35/35ad3ecde3e1bbeebeed9371a7be62c1d55c260b.svn-base
  21. 275 0
      iamberry-app-service/.svn/pristine/37/373dd0f242f036421cdc6cc08fb95e5d751f29cc.svn-base
  22. 28 0
      iamberry-app-service/.svn/pristine/38/3849d89ceb4b15187eea4a77937957b86ec9ea5c.svn-base
  23. 36 0
      iamberry-app-service/.svn/pristine/3a/3a5118c7ba0d99778452c001d7849bfb4281804e.svn-base
  24. 42 0
      iamberry-app-service/.svn/pristine/3c/3cea7ce6332778f5a41903a41ebbe8243da50115.svn-base
  25. 112 0
      iamberry-app-service/.svn/pristine/4a/4a804bee65556b4cae520706c2c66ce04ba4d982.svn-base
  26. 132 0
      iamberry-app-service/.svn/pristine/4b/4bd7ebde68ab0194a2d2364a8672e2b7b2ded279.svn-base
  27. 51 0
      iamberry-app-service/.svn/pristine/4e/4ec520dd2e95ae6506336280699159e29fd1caf3.svn-base
  28. 214 0
      iamberry-app-service/.svn/pristine/56/5632411515b04419b9ef7ee5140ad8786dad7def.svn-base
  29. 322 0
      iamberry-app-service/.svn/pristine/61/61e4d3ff2092231f7493a1795875b34a8ab54e32.svn-base
  30. 258 0
      iamberry-app-service/.svn/pristine/67/6793b7a7549090357c347172949d656341bd2078.svn-base
  31. 161 0
      iamberry-app-service/.svn/pristine/68/68044b5072200d8a307dd1ae37e679d11dbe46ee.svn-base
  32. 124 0
      iamberry-app-service/.svn/pristine/6a/6a7a0da8fe56e31789acad87e32b6a1fa757d6dd.svn-base
  33. 428 0
      iamberry-app-service/.svn/pristine/6d/6d71eb3b75e43417b4e613f95997d50005b5b3e6.svn-base
  34. 8 0
      iamberry-app-service/.svn/pristine/6e/6e9149fa6f1e99bd69d036491ba5018096d42ed0.svn-base
  35. 109 0
      iamberry-app-service/.svn/pristine/74/7410d70b8102f6c7047b091b2bc149029cdde9f5.svn-base
  36. 315 0
      iamberry-app-service/.svn/pristine/75/75402f7c9e9376c094b8b466c774888400f97887.svn-base
  37. 466 0
      iamberry-app-service/.svn/pristine/79/79077725222d514c884786a7d77c9bbc0c892290.svn-base
  38. 332 0
      iamberry-app-service/.svn/pristine/82/8279a59ecd0413d2345ab461fd4e1ae624e05b19.svn-base
  39. 206 0
      iamberry-app-service/.svn/pristine/86/8651bfedb99c3f870e7b51d11101bfc166a0eafb.svn-base
  40. 33 0
      iamberry-app-service/.svn/pristine/94/94f8bfeae43f9f4c6212905f97d847ae200de6e6.svn-base
  41. 13 0
      iamberry-app-service/.svn/pristine/9e/9e8c3cae6cd5770f9af5030fd24fd7e10f45a981.svn-base
  42. 408 0
      iamberry-app-service/.svn/pristine/9e/9ef20ad208522b072f32f947ca92f5a6a455a5e3.svn-base
  43. 80 0
      iamberry-app-service/.svn/pristine/a0/a0b5c96675fe102158038d9ef8c7aa4df2ba5437.svn-base
  44. 4 0
      iamberry-app-service/.svn/pristine/a1/a112be21c325d37ebc17baafd40c0386b5d09df1.svn-base
  45. 13 0
      iamberry-app-service/.svn/pristine/a2/a29da2c9387727a0443ea32197fca2a15446cce8.svn-base
  46. 5 0
      iamberry-app-service/.svn/pristine/a4/a415529b45b0bb67396c564812685d180cdf4cb4.svn-base
  47. 14 0
      iamberry-app-service/.svn/pristine/a6/a649149e80fea05d97aff6242f09fd9758a6b81b.svn-base
  48. 31 0
      iamberry-app-service/.svn/pristine/a7/a78e79d8c942794081ddac9f86ee3697bf1d1100.svn-base
  49. 54 0
      iamberry-app-service/.svn/pristine/ac/acd0a1532bbc16638cd765c60dbcfe3dfe334397.svn-base
  50. 74 0
      iamberry-app-service/.svn/pristine/b3/b3f73b2346f54c1ba388304baa51bf4c5b21c294.svn-base
  51. 412 0
      iamberry-app-service/.svn/pristine/b8/b8a6e3d276a2ebf08c6e266102b00851d0f6ca99.svn-base
  52. 173 0
      iamberry-app-service/.svn/pristine/b8/b8adeb7d5fc32ee5b18f860f52eb371555f5d027.svn-base
  53. 50 0
      iamberry-app-service/.svn/pristine/bc/bc4cc088d1e577a74bb296e781ccb68c5d56430a.svn-base
  54. 134 0
      iamberry-app-service/.svn/pristine/c4/c4387a5ebd16d725157a6fccb9371f1f72894085.svn-base
  55. 43 0
      iamberry-app-service/.svn/pristine/c7/c7eba3856991bd528aacf51a0fa5636aeb6a14fa.svn-base
  56. 17 0
      iamberry-app-service/.svn/pristine/cf/cfcd5b8b5e2f1ae3d62ec1a1cdaf78cec6e9bc4a.svn-base
  57. 6 0
      iamberry-app-service/.svn/pristine/dd/dd8ba1b2aaf14f5f5f1eb48d415562586b2f0f2d.svn-base
  58. 38 0
      iamberry-app-service/.svn/pristine/e8/e831058e9ffbfb5c63884bd0449afd5c863f2e7b.svn-base
  59. 63 0
      iamberry-app-service/.svn/pristine/f3/f32f3f75418e6fd316673fbfca6d425ee12b37d8.svn-base
  60. 374 0
      iamberry-app-service/.svn/pristine/f8/f82f947c962674daed06830f08b211b43cd1387d.svn-base
  61. BIN
      iamberry-app-service/.svn/wc.db
  62. 74 0
      iamberry-app-service/pom.xml
  63. 50 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/CodeMapper.java
  64. 13 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/LogMapper.java
  65. 76 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/MachineMapper.java
  66. 80 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/MessageMapper.java
  67. 258 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/MilkMapper.java
  68. 161 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/UserMapper.java
  69. 59 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/codeMapper.xml
  70. 17 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/logMapper.xml
  71. 124 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/machineMapper.xml
  72. 209 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/messageMapper.xml
  73. 315 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/milkMapper.xml
  74. 206 0
      iamberry-app-service/src/main/java/com/iamberry/app/mapper/userMapper.xml
  75. 63 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/BaseService.java
  76. 332 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/CodeServiceImpl.java
  77. 28 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/LogServiceImpl.java
  78. 173 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/MachineServiceImpl.java
  79. 132 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/MessageServiceImpl.java
  80. 466 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/MilkServiceImpl.java
  81. 422 0
      iamberry-app-service/src/main/java/com/iamberry/app/service/UserServiceImpl.java
  82. 134 0
      iamberry-app-service/src/main/java/com/iamberry/app/sqlprovider/DMLProvider.java
  83. 33 0
      iamberry-app-service/src/main/java/com/iamberry/app/start/InitApp.java
  84. 374 0
      iamberry-app-service/src/main/java/com/iamberry/app/ulitity/Utility.java
  85. 51 0
      iamberry-app-service/src/main/resources/iamberry-app-service-datasource.xml
  86. 34 0
      iamberry-app-service/src/main/resources/iamberry-app-service-mybatis.xml
  87. 31 0
      iamberry-app-service/src/main/resources/iamberry-app-service-provider.xml
  88. 54 0
      iamberry-app-service/src/main/resources/iamberry-app-service-spring.xml
  89. 14 0
      iamberry-app-service/src/main/resources/jdbc.properties
  90. 42 0
      iamberry-app-service/src/main/resources/log4j.properties
  91. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/CodeMapper.class
  92. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/LogMapper.class
  93. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/MachineMapper.class
  94. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/MessageMapper.class
  95. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/MilkMapper.class
  96. BIN
      iamberry-app-service/target/classes/com/iamberry/app/mapper/UserMapper.class
  97. 59 0
      iamberry-app-service/target/classes/com/iamberry/app/mapper/codeMapper.xml
  98. 17 0
      iamberry-app-service/target/classes/com/iamberry/app/mapper/logMapper.xml
  99. 124 0
      iamberry-app-service/target/classes/com/iamberry/app/mapper/machineMapper.xml
  100. 0 0
      iamberry-app-service/target/classes/com/iamberry/app/mapper/messageMapper.xml

+ 38 - 0
iamberry-app-service/.classpath

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" path="/iamberry-common-tool"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+		<attributes>
+			<attribute name="owner.project.facets" value="java"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 36 - 0
iamberry-app-service/.project

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>iamberry-app-service</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>

+ 6 - 0
iamberry-app-service/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8

+ 13 - 0
iamberry-app-service/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8

+ 4 - 0
iamberry-app-service/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 6 - 0
iamberry-app-service/.settings/org.eclipse.wst.common.component

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="iamberry-app-service">
+        <wb-resource deploy-path="/" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
+    </wb-module>
+</project-modules>

+ 5 - 0
iamberry-app-service/.settings/org.eclipse.wst.common.project.facet.core.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="jst.utility" version="1.0"/>
+  <installed facet="java" version="1.8"/>
+</faceted-project>

+ 2 - 0
iamberry-app-service/.settings/org.eclipse.wst.validation.prefs

@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1

+ 1 - 0
iamberry-app-service/.svn/entries

@@ -0,0 +1 @@
+12

+ 1 - 0
iamberry-app-service/.svn/format

@@ -0,0 +1 @@
+12

+ 274 - 0
iamberry-app-service/.svn/pristine/03/03fd8050edaa8cd7d94adc28309c9734d57eaa8a.svn-base

@@ -0,0 +1,274 @@
+package com.iamberry.app.service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.dto.RecordDTO;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.MilkService;
+import com.iamberry.app.ulitity.Utility;
+
+/**
+ * MilkService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:10
+ */
+@Service
+public class MilkServiceImpl extends BaseService implements MilkService {
+
+	/**
+	 * setMilkMakingRecord
+	 * @param makingRecord
+	 * @param token
+	 * @param recordId
+	 * @return
+	 */
+	public MilkMakingRecord setMilkMakingRecord(MilkMakingRecord makingRecord, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		makingRecord.setUser(userInfo.getId());
+		makingRecord.setTimestamp_(new Date());
+		milkMapper.insertMilkMakingRecord(makingRecord);
+		return makingRecord;
+	}
+
+	/**
+	 * searchUserRecordsBytime
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @param startTime
+	 * @param endTime
+	 * @return Milk Making Record List
+	 */
+	public Map<String, List<RecordDTO>> searchUserRecordsByTime(Long userId, String dateStatus, String chosenDate,
+			String machineMac) {
+
+		Map<String, List<RecordDTO>> recordInfos = new LinkedHashMap<String, List<RecordDTO>>();
+		String dateType = null, formatter = null;
+		Calendar calendar = Calendar.getInstance();
+		if (chosenDate != null) {
+			// calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd
+			// HH:mm:ss", chosenDate));
+			// 防止无数据时显示分钟错误
+			chosenDate = chosenDate.substring(0, chosenDate.length() - 6) + ":00:00";
+			calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+		} else {
+			calendar.setTime(new Date());
+		}
+		Date start = null, end = null;
+		switch (dateStatus) {
+		case "day":
+			dateType = "days";
+			formatter = "%Y%m%d%H";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "week":
+			dateType = "weeks";
+			formatter = "%Y%m%d";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			if (Calendar.SUNDAY < Calendar.MONDAY) {
+				calendar.add(Calendar.DATE, 7);
+			}
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "year":
+			dateType = "years";
+			formatter = "%Y%m";
+			calendar.set(calendar.get(Calendar.YEAR), 0, 1, 0, 0, 0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), 11, 31, 23, 59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		}
+		return Utility.fillAppMachineRecordWithZero(Utility.synAppMachineRecord(recordInfos), dateType, chosenDate);
+	}
+
+	/**
+	 * searchUserRecordById
+	 *
+	 * @author Moon Cheng
+	 * @param recordId
+	 * @return Milk Making Record Information
+	 */
+	public MilkMakingRecord searchUserRecordById(Long recordId) {
+		MilkMakingRecord makingRecord = milkMapper.selectMilkMakingRecord(recordId);
+		return makingRecord;
+	}
+
+	/**
+	 * 根据用户,获取冲奶记录的-->总量和次数
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @return
+	 */
+	public RecordCountInfoDTO getTotalMilkVolumeMadeByUser(Long userId) {
+		RecordCountInfoDTO recordcount = milkMapper.getMilkPowderSumByUser(userId);
+		return  recordcount;
+	}
+
+	/**
+	 * setMilkPowderInfo
+	 *
+	 * @author Moon Cheng
+	 * @param entity
+	 * @param token
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo setMilkPowderInfo(MilkPowderInfo entity, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		// change status as user's phone number
+		entity.setStatus_(
+				userInfo.getUsername().length() > 11 ? Constants.MILK_POWDER_NOT_APPROVED : userInfo.getUsername());
+		entity.setCreated_on(new Date());
+		milkMapper.insertMilkPowderInfo(entity);
+		return entity;
+	}
+
+	/**
+	 * searchMilkPowderInfoByBarCode
+	 *
+	 * @author Moon Cheng
+	 * @param barcode
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo searchMilkPowderInfoByBarCode(String barcode) {
+		MilkPowderInfo milkPowderInfo = milkMapper.selectMilkPowderInfo(barcode);
+		return milkPowderInfo;
+	}
+
+	/**
+	 * 
+	 * 通过品牌名获取奶粉信息
+	 * @author Moon Cheng, Yin
+	 * @param brand
+	 * @return Milk Powder List
+	 */
+	public Map<String, List<String>> searchMilkPowderInfosByBrand(String brand) {
+		brand = "%" + brand.trim() + "%";
+		Map<String, List<String>> infos = new IdentityHashMap<String, List<String>>();
+		List<MilkInfoDTO> milkInfo = milkMapper.selectMilkInfoBybrand(brand);
+		for (int i = 0; i < milkInfo.size(); i++) {
+			List<String> list = new LinkedList<String>();
+			list.add(milkInfo.get(i).getLevel() + ":" + milkInfo.get(i).getType() + ":"
+					+ milkInfo.get(i).getPowder_ratio() + ":" + milkInfo.get(i).getId() + ":"
+					+ milkInfo.get(i).getWeight_per_spoon());
+			infos.put(milkInfo.get(i).getSeries(),list);
+		}
+		
+		return infos;
+	}
+
+	/**
+	 * searchMilkPowderBrand
+	 *
+	 * @return Brand List
+	 */
+	public List<String> searchMilkPowderBrand() {
+		List<String> milkPowderInfos = milkMapper.selectMilkPowderBrand();
+		List<String> result = new ArrayList<>();
+		milkPowderInfos.forEach(milk -> {
+			if (NumberUtils.isNumber(milk) && milk.contains(".")) {
+				milk = milk.substring(0, milk.indexOf("."));
+			}
+			result.add(milk);
+		});
+		return result;
+	}
+
+	/**
+	 * searchMilkInfoByBrandSeriesLevel
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo searchMilkInfoByBrandSeriesLevel(String brand, String series, String level) {
+		return milkMapper.selectMilkInfoByBrandSeriesLevel(brand, series, level);
+	}
+
+	// =====================================TuyaHistoryData======================================
+	/**
+	 * getLastRecordDate
+	 *
+	 * @return
+	 */
+	public Date getLastRecordDate() {
+		Date lastDate = milkMapper.selectLastRecordDate();
+		return lastDate == null ? new Date() : lastDate;
+	}
+
+	/**
+	 * addRecordData
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void addRecordData(String devId, String value, Long time, Long userId) {
+		MilkMakingRecord milkMakingRecord = new MilkMakingRecord();
+		milkMakingRecord.setVolume(Integer.parseInt(value));
+		milkMakingRecord.setMachine(devId);
+		milkMakingRecord.setTimestamp_(new Date(time));
+		milkMakingRecord.setUser(userId);
+		milkMapper.insertRecordData(milkMakingRecord);
+	}
+
+	@Override
+	public void setMilkImages(MilkImages images) {
+		// TODO Auto-generated method stub
+		milkMapper.insertMilkImages(images);
+	}
+}

+ 59 - 0
iamberry-app-service/.svn/pristine/07/078a7123ffa60f37a3b34e46282d76040fb1efcf.svn-base

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.CodeMapper">
+	
+	<!-- 保存一个发送记录 -->
+	<insert id="save" parameterType="CodeValid">
+		INSERT INTO
+			CODE_VALID
+				(
+					CODE_PHONE, CODE_VALUE, CODE_SEND_DATE, CODE_VALID_DATE, 
+					CODE_STATUS, CODE_MSG, CODE_CHANNEL, CODE_USE, CODE_SCENARIO
+				)
+		VALUES
+			(
+				#{codePhone}, #{codeValue}, #{codeSendDate}, #{codeValidDate}, 
+				#{codeStatus}, #{codeMsg}, #{codeChannel}, #{codeUse}, #{codeScenario}
+			)
+	</insert>
+	
+	<!-- 获取用户最近的记录 -->
+	<select id="getLast" parameterType="string" resultType="CodeValid">
+		SELECT 
+			*
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		ORDER BY 
+			CODE_ID DESC
+		LIMIT 0, 1
+	</select>
+	
+	<!-- 根据code_id,更新本次记录状态 -->
+	<update id="update" parameterType="long">
+		UPDATE 
+			CODE_VALID 
+		SET 
+			CODE_USE = 1
+		WHERE 
+			CODE_ID = #{codeID}
+	</update>
+	
+	<!-- 检查当前手机号码发送的次数 -->
+	<select id="getInterval" parameterType="java.util.Map" resultType="int">
+		<![CDATA[
+		SELECT 
+			count(code_id)
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		AND
+			CODE_SEND_DATE >= #{startDate}
+		AND
+			CODE_SEND_DATE <= #{enDate}
+		]]>
+	</select>
+</mapper>

+ 35 - 0
iamberry-app-service/.svn/pristine/07/07e4798d1c60d2e0b2cc2201a96847e86753f88b.svn-base

@@ -0,0 +1,35 @@
+package com.iamberry.app.mapper;
+
+import com.iamberry.app.core.entity.CodeValid;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码 SQL Mapper映射
+ */
+public interface CodeMapper {
+
+	/**
+	 * 保存一条发送记录
+	 * @param codeValid
+	 * @return
+	 */
+	public int save(CodeValid codeValid);
+	
+	/**
+	 * 获取某一个手机号码最后的发送记录
+	 * @param phone
+	 * @return
+	 */
+	public CodeValid getLast(String phone);
+	
+	/**
+	 * 更新状态
+	 * @param codeId
+	 * @return
+	 */
+	public int update(Long codeId);
+}

+ 151 - 0
iamberry-app-service/.svn/pristine/0f/0fb21d45360680afecbbd13f76c30b3be799a577.svn-base

@@ -0,0 +1,151 @@
+package com.iamberry.app.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.User;
+
+/**
+ *
+ * @author Moon Cheng
+ * @date 2016年1月16日 下午12:25:05
+ */
+public interface UserMapper {
+
+	// ================================================================================================
+	// ------------------------------------------User----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 根据id查询user所有信息
+	 *
+	 * @param id
+	 * @return User Information
+	 */
+	public User selectUserById(Long id);
+
+	/**
+	 * 根据username查询user所有信息
+	 *
+	 * @param username
+	 * @return User Information
+	 */
+	public User selectUserByUsername(String username);
+
+	/**
+	 * 通过ext_open_id查询user所有信息
+	 *
+	 * @param extOpenId
+	 * @return User Information
+	 */
+	public User selectUserByExtOpenId(String extOpenId);
+
+	/**
+	 * 添加用户信息到user表中
+	 *
+	 * @param user
+	 */
+	public void insertUser(User user);
+
+	/**
+	 * 根据id修改user表数据
+	 *
+	 * @param user
+	 */
+	public int updateUser(User user);
+
+	/**
+	 * 根据id修改user表的个人头像
+	 *
+	 * @author Moon Cheng
+	 * @param image
+	 * @param id
+	 */
+	public int updateDisplayPicture(String imageUrl, Long id);
+
+	/**
+	 * 根据用户名和密码查询用户表信息
+	 *
+	 * @param username
+	 * @param password
+	 * @return User Information
+	 */
+	public User validateUser(String username, String password);
+
+	/**
+	 * 通过id修改用户表密码
+	 *
+	 * @param id
+	 * @param newPassword
+	 * @return update row count
+	 */
+	public int changePassword(Long id, String newPassword);
+
+	// ================================================================================================
+	// ------------------------------------------UserToken----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 通过token查询user表所有信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public User selectUserByToken(String token);
+
+	/**
+	 * 根据id修改token值
+	 *
+	 * @param token
+	 * @param userId
+	 * @return int
+	 */
+	public int updateUserToken(String token, Long userId);
+
+	/**
+	 * 根据id修改user表的用户名
+	 *
+	 * @author Moon Cheng
+	 * @param username
+	 * @param userId
+	 * @return
+	 */
+	public int updateUserName(String username, Long userId);
+
+	/**
+	 * 通过key_查询sys_config表数据
+	 *
+	 * @param key
+	 * @return String
+	 */
+	public String selectConfig(String key);
+
+	// ================================================================================================
+	// ------------------------------------------UserAvator----------------------------------------------
+	// ================================================================================================
+	/**
+	 * USER_AVATOR表中添加数据
+	 *
+	 * @param id
+	 * @param avator
+	 *            void
+	 */
+	public void insertUserAvator(Long id, String avator);
+
+	/**
+	 * 通过user_id修改USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @param avator
+	 * @return int
+	 */
+	public int updateUserAvator(Long id, String avator);
+
+	/**
+	 * 根据user_id查询USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @return String
+	 */
+	public String selectUserAvator(Long id);
+	
+	@Deprecated
+	public java.util.List<User> getAll(@Param("start") int start, @Param("end") int end);
+}

+ 76 - 0
iamberry-app-service/.svn/pristine/14/14c97ecad830290fee1955c6a5adbbd11a3642cf.svn-base

@@ -0,0 +1,76 @@
+package com.iamberry.app.mapper;
+
+import java.util.List;
+
+import com.iamberry.app.core.entity.Machine;
+
+public interface MachineMapper {
+
+	/**
+	 *	添加一台机器
+	 * @param machine
+	 * @return void
+	 */
+	public void insertMachine(Machine machine);
+
+	/**
+	 *	根据id 修改一台机器信息
+	 * @param machine
+	 */
+	public void updateMachine(Machine machine);
+
+	/**
+	 * 根据机器id 修改个人机器状态,增加修改时间为当前时间的字段
+	 * 取消数据库中表machine的时间修改字段自动更新!
+	 * @param status,
+	 *            id
+	 */
+	public int updateMachineStatus(String status,Long id);
+
+	/**
+	 *	根据id 修改一台机器的位置信息
+	 * @param location,
+	 *            id
+	 * @return void
+	 */
+	public int updateMachineLocation(String location,Long id);
+
+	/**
+	 *	按用户,查询所有机器
+	 * @author Moon Cheng
+	 * @param owner
+	 * @return
+	 */
+	public List<Machine> selectMachineByOwner(Long owner);
+
+	/**
+	 * 	根据id 查询一台机器
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public Machine selectMachineById(Long id);
+	
+	/**
+	 * 	根据机器码和所属用户 查一台机器id
+	 * @param devId
+	 * @param userId
+	 * @return
+	 */ 
+	public Long isDevUserPairExist(String devId, Long userId);
+	
+	/**
+	 * 	根据机器码 修改个人机器状态,增加修改时间为当前时间的字段
+	 *
+	 * @param mac
+	 * @param status
+	 */
+	public void updateStatusByMac(String devId, String status);
+
+	/**
+	 * 根据机器的ID,查询最近的一个用户ID
+	 * @param devId
+	 * @return
+	 */
+	public Long selectUserIDByDevId(String devId);
+}

+ 189 - 0
iamberry-app-service/.svn/pristine/16/167b6f94f00b1c53d68e86bcf1ff466153459f17.svn-base

@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.UserMapper">
+
+	<sql id="userAttribute">
+		id,
+		username,
+		password,
+		token,
+		display_name,
+		display_picture,
+		created_on,
+		ext_open_id,
+		ext_name,
+		ext_type,
+		location,
+		baby_nickname,
+		baby_dob,
+		baby_gender,
+		status_ ,
+		user_tel userTel
+	</sql>
+	
+	<resultMap type="User" id="userMap">
+		<id property="id" column="id"/>
+		<result property="username" column="username"/>
+		<result property="password" column="password"/>
+		<result property="token" column="token"/>
+		<result property="display_name" column="display_name"/>
+		<result property="display_picture" column="display_picture"/>
+		<result property="created_on" column="created_on"/>
+		<result property="ext_open_id" column="ext_open_id"/>
+		<result property="ext_name" column="ext_name"/>
+		<result property="ext_type" column="ext_type"/>
+		<result property="location" column="location"/>
+		<result property="baby_nickname" column="baby_nickname"/>
+		<result property="baby_dob" column="baby_dob"/>
+		<result property="baby_gender" column="baby_gender"/>
+		<result property="status_" column="status_"/>
+	</resultMap>
+	
+	<!-- 根据id查询user所有信息 -->
+	<select id="selectUserById" parameterType="java.lang.Long" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute" />
+		FROM USER WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据username查询user所有信息 -->
+	<select id="selectUserByUsername" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE USERNAME = #{0}
+	</select>
+	
+	<!-- 通过ext_open_id查询user所有信息 -->
+	<select id="selectUserByExtOpenId" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE EXT_OPEN_ID = #{0}
+	</select>
+	
+	<!-- 添加用户信息到user表中 -->
+	<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO USER 
+			(
+				USERNAME,PASSWORD,TOKEN,DISPLAY_NAME,DISPLAY_PICTURE,
+				CREATED_ON,EXT_OPEN_ID,EXT_NAME,EXT_TYPE,
+				LOCATION,BABY_NICKNAME,BABY_DOB,BABY_GENDER,STATUS_,USER_TEL) 
+		VALUES 
+			(
+				#{username},#{password},#{token},#{display_name},#{display_picture},
+				NOW(),#{ext_open_id},#{ext_name},#{ext_type},
+				#{location},#{baby_nickname},#{baby_dob},#{baby_gender},#{status_}, #{userTel}
+			)
+	</insert>
+	
+	<!-- 根据id修改user表数据 -->
+	<update id="updateUser" parameterType="User">
+		UPDATE USER 
+		<set>
+			<if test="username != null and username != ''">
+				USERNAME = #{username}, 
+			</if>
+			<if test="password != null and password != ''">
+				PASSWORD = #{password}, 
+			</if>
+			<if test="token != null and token != ''">
+				TOKEN = #{token}, 
+			</if>
+			<if test="display_name != null and display_name != ''">
+				DISPLAY_NAME = #{display_name}, 
+			</if>
+			<if test="display_picture != null and display_picture != ''">
+				DISPLAY_PICTURE = #{display_picture}, 
+			</if>
+			<if test="ext_open_id != null and ext_open_id != ''">
+				EXT_OPEN_ID = #{ext_open_id}, 
+			</if>
+			<if test="ext_name != null and ext_name != ''">
+				EXT_NAME = #{ext_name}, 
+			</if>
+			<if test="ext_type != null and ext_type != ''">
+				EXT_TYPE = #{ext_type}, 
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION = #{location}, 
+			</if>
+			<if test="baby_nickname != null and baby_nickname != ''">
+				BABY_NICKNAME = #{baby_nickname}, 
+			</if>
+			<if test="baby_dob != null and baby_dob != ''">
+				BABY_DOB = #{baby_dob}, 
+			</if>
+			<if test="baby_gender != null and baby_gender != ''">
+				BABY_GENDER = #{baby_gender}, 
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_ = #{status_},
+			</if>
+			<if test="userTel != null and userTel != ''">
+				USER_TEL = #{userTel} 
+			</if>
+		</set>
+		WHERE 
+			ID = #{id} 
+	</update>
+	
+	<!-- 根据id修改user表的个人头像 -->
+	<update id="updateDisplayPicture">
+		UPDATE USER SET DISPLAY_PICTURE = #{0} WHERE ID = #{1} 
+	</update>
+	
+	<!-- 根据用户名和密码查询用户表信息 -->
+	<select id="validateUser" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE USERNAME=#{0} AND PASSWORD=#{1} 
+	</select>
+	
+	<!-- 通过id修改用户表密码 -->
+	<update id="changePassword">
+		UPDATE USER SET PASSWORD=#{1} WHERE ID=#{0}
+	</update>
+	
+	<!-- 通过token查询user表所有信息 -->
+	<select id="selectUserByToken" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE TOKEN=#{0} 
+	</select>
+	
+	<!-- 根据id修改token值 -->
+	<update id="updateUserToken">
+		UPDATE USER SET TOKEN=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 根据id修改user表的用户名 -->
+	<update id="updateUserName">
+		UPDATE USER SET USERNAME=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 通过key_查询sys_config表数据 -->
+	<select id="selectConfig" parameterType="java.lang.String" resultType="String">
+		SELECT VALUE_ FROM SYS_CONFIG WHERE KEY_ = #{0}
+	</select>
+	
+	<!-- USER_AVATOR表中添加数据 -->
+	<insert id="insertUserAvator">
+		INSERT INTO USER_AVATOR (USER_ID, AVATOR) VALUE (#{0}, #{1})
+	</insert>
+	
+	<!-- 通过user_id修改USER_AVATOR表数据 -->
+	<update id="updateUserAvator">
+		UPDATE USER_AVATOR SET AVATOR = #{1} WHERE USER_ID = #{0}
+	</update>
+	
+	<!-- 根据user_id查询USER_AVATOR表数据 -->
+	<select id="selectUserAvator" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT avator FROM USER_AVATOR WHERE USER_ID = #{id}
+	</select>
+	
+	<select id="getAll" parameterType="java.util.Map" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute"/> 
+		FROM 
+			USER
+		LIMIT
+			#{start}, #{end}
+	</select>
+</mapper>

+ 209 - 0
iamberry-app-service/.svn/pristine/1f/1ff8519924b79f823f3dd8265176912dc799f4da.svn-base

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MessageMapper">
+	<sql id="messageAllField">
+		ID,TITLE, CONTENT,URL,
+		FORWORD,IS_NEEDSEND,IS_READ,
+		CREATE_DATE,READ_DATE,SEND_TYPE,
+		USER,REMARK,SEND_RESULT
+	</sql>
+	<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
+    <resultMap type="Message" id="messageMap">
+        <id property="id" column="ID"/>
+        <result property="title" column="TITLE"/>
+        <result property="content" column="CONTENT"/>
+        <result property="url" column="URL"/>
+        <result property="forword" column="FORWORD"/>
+        <result property="is_needsend" column="IS_NEEDSEND"/>
+        
+        <result property="is_read" column="IS_READ"/>
+        <result property="create_date" column="CREATE_DATE"/>
+        <result property="read_date" column="READ_DATE"/>
+        <result property="send_type" column="SEND_TYPE"/>
+        <result property="user" column="USER"/>
+        <result property="remark" column="REMARK"/>
+        <result property="send_result" column="SEND_RESULT"/>
+    </resultMap>
+    
+	<sql id="userAttribute">
+		ID,
+		USERNAME,
+		PASSWORD,
+		TOKEN,
+		DISPLAY_NAME,
+		DISPLAY_PICTURE,
+		CREATED_ON,
+		EXT_OPEN_ID,
+		EXT_NAME,
+		EXT_TYPE,
+		LOCATION,
+		BABY_NICKNAME,
+		BABY_DOB,
+		BABY_GENDER,
+		STATUS_ 
+	</sql>
+	
+	<!-- 查询符合条件的用户列表 -->
+	<select id="selectUser" parameterType="PageBean" resultType="User">
+		SELECT 
+			<include refid="userAttribute"></include>
+		FROM USER
+		WHERE 1=1
+	    <if test="params.username!=null and params.username!=''" >
+			AND USERNAME LIKE CONCAT('%',#{params.username},'%')
+	    </if>
+		<if test='recordBegin>0 and pageSize>0'>
+			limit ${recordBegin},${pageSize}
+	    </if>
+	    <if test='recordBegin==0 and pageSize>0 '>
+			limit ${pageSize}
+	    </if> 
+	</select>
+	
+	<!-- 获取用户总条数 -->
+	<select id="selectUserCount" parameterType="SerchParam" resultType="int">
+		SELECT COUNT(ID) FROM USER WHERE 1=1 
+	 	<if test="username!=null and username!=''">
+    		AND USERNAME LIKE CONCAT('%',#{username},'%')
+    	</if>
+	</select>
+	
+	<!-- 获取符合条件所有消息 -->
+	<select id="selectMessageRecoreds" parameterType="PageBean" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM (
+			SELECT ID,TITLE, CONTENT,URL,FORWORD,IS_NEEDSEND,IS_READ,CREATE_DATE,READ_DATE,SEND_TYPE,
+			(SELECT USERNAME FROM USER WHERE ID = a.user) USER,REMARK,SEND_RESULT  FROM MESSAGE a 
+		) a
+    	WHERE 1=1
+    	<if test="params.title!=null and params.title!=''" >
+			AND TITLE LIKE CONCAT('%',#{params.title},'%') 
+    	</if>
+		<if test="params.username!=null and params.username!=''">
+			AND USER LIKE CONCAT('%',#{params.username},'%') 
+		</if>
+		<if test="params.beginDate!= null and  params.beginDate!= ''" >
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') >= DATE_FORMAT(#{params.beginDate},'%Y-%m-%d')]]>
+		</if>
+		<if test="params.endDate!= null and params.endDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') <= DATE_FORMAT(#{params.endDate},'%Y-%m-%d')]]>
+    	</if>
+		ORDER BY CREATE_DATE DESC,USER 
+	    <if test='recordBegin>0 and pageSize>0'>
+			LIMIT ${recordBegin},${pageSize}
+	    </if>
+	    <if test='recordBegin==0 and pageSize>0 '>
+			LIMIT ${pageSize}
+	    </if>
+	</select>
+	
+	<!-- 获取所有消息的总条数 -->
+	<select id="selectMessageCount" parameterType="SerchParam" resultType="int">
+		SELECT COUNT(1) FROM MESSAGE
+		WHERE 1=1
+	    <if test="title!=null and title!=''">
+			AND TITLE LIKE CONCAT('%',#{title},'%') 
+	    </if>
+	    <if test="beginDate!= null and  beginDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') >= DATE_FORMAT(#{beginDate},'%Y-%m-%d')]]>
+	    </if>
+	    <if test="endDate!= null and endDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') <= DATE_FORMAT(#{endDate},'%Y-%m-%d')]]>
+	    </if>
+	</select>
+	
+	<!-- 根据id 修改一条消息 -->
+	<update id="updateMessage" parameterType="Message">
+		UPDATE MESSAGE 
+		<set>
+			<if test="title != null and title != ''">
+				TITLE=#{title},
+			</if>
+			<if test="content != null and content != ''">
+				CONTENT=#{content},
+			</if>
+			<if test="url != null and url != ''">
+				URL=#{url},
+			</if>
+			<if test="forword != null and forword != ''">
+				FORWORD=#{forword},
+			</if>
+			<if test="is_needsend != null and is_needsend != ''">
+				IS_NEEDSEND=#{is_needsend},
+			</if>
+			<if test="is_read != null and is_read != ''">
+				IS_READ=#{is_read},
+			</if>
+			<if test="create_date != null and create_date != ''">
+				CREATE_DATE=#{create_date},
+			</if>
+			<if test="read_date != null and read_date != ''">
+				READ_DATE=#{read_date},
+			</if>
+			<if test="send_type != null and send_type != ''">
+				SEND_TYPE=#{send_type},
+			</if>
+			<if test="user != null and user != ''">
+				USER=#{user},
+			</if>
+			<if test="remark != null and remark != ''">
+				REMARK=#{remark},
+			</if>
+			<if test="send_result != null and send_result != ''">
+				SEND_RESULT=#{send_result}
+			</if>
+		</set>
+		WHERE ID=#{id}
+	</update>
+	
+	<!-- 添加一条消息 -->
+	<insert id="insertMessage" parameterType="Message"
+		useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MESSAGE
+			(
+				TITLE, CONTENT,URL, FORWORD,IS_NEEDSEND,IS_READ,
+				CREATE_DATE,READ_DATE,SEND_TYPE, USER,REMARK,SEND_RESULT
+			)
+		VALUES
+			(
+				#{title},#{content},#{url},#{forword},#{is_needsend},#{is_read},
+				#{create_date},#{read_date},#{send_type},#{user},
+				#{remark},#{send_result}
+			)
+	</insert>
+	
+	<!-- 获取系统的所有消息 -->
+	<select id="selectSysMessageRecoreds" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM MESSAGE 
+		WHERE USER IS NULL 
+		ORDER BY CREATE_DATE DESC
+	</select>
+	
+	<!-- 根据id获取一条信息  -->
+	<select id="selectUserMessageByid" parameterType="Long" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM MESSAGE WHERE ID = #{id}
+	</select>
+	
+	<!-- 根据用户id获取该用户的所有消息 -->
+	<select id="selectUserMessageRecoreds" parameterType="Long" resultMap="messageMap">
+		SELECT
+			<include refid="messageAllField"></include>
+		FROM MESSAGE WHERE USER=#{userid}  ORDER BY CREATE_DATE DESC
+	</select>
+	
+	<!--  获取某状态的用户消息 -->
+	<select id="selectUserMessageByisread" resultType="int">
+		SELECT COUNT(1)  FROM message where is_read = #{1} and user=#{0}	
+	</select>
+</mapper>

+ 49 - 0
iamberry-app-service/.svn/pristine/2b/2bba3a4dbd00217561718d7077c9e15a6d6d1ad3.svn-base

@@ -0,0 +1,49 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.CodeValid;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码 SQL Mapper映射
+ */
+public interface CodeMapper {
+
+	/**
+	 * 保存一条发送记录
+	 * @param codeValid
+	 * @return
+	 */
+	public int save(CodeValid codeValid);
+	
+	/**
+	 * 获取某一个手机号码最后的发送记录
+	 * @param phone
+	 * @return
+	 */
+	public CodeValid getLast(String phone);
+	
+	/**
+	 * 更新状态
+	 * @param codeId
+	 * @return
+	 */
+	public int update(Long codeId);
+	
+	/**
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public int getInterval(@Param("startDate") Date startDate, @Param("enDate") Date endDate, @Param("phone")String phone);
+}

+ 235 - 0
iamberry-app-service/.svn/pristine/32/32ad929fdffcdec789274929c308c99854de7ff0.svn-base

@@ -0,0 +1,235 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectKey;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.sqlprovider.DMLProvider;
+
+public interface MilkMapper {
+
+	/**
+	 * 添加信息到milk_making_record表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkMakingRecord(MilkMakingRecord entity);
+
+	/**
+	 * 根据id修改MILK_MAKING_RECORD的start和comments属性
+	 *
+	 * @param stars
+	 * @param comments
+	 * @param id
+	 */
+	public void updateMilkMakingRecord(int stars, String comments, Long id);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param userId
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, Long userId, String devId);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param devids
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMachineMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, String devids);
+
+	/**
+	 * 根据id查询MILK_MAKING_RECORD所有信息
+	 *
+	 * @author Moon Cheng
+	 * @param id
+	 * @return
+	 */
+	public MilkMakingRecord selectMilkMakingRecord(Long id);
+
+	/**
+	 * 根据user查询所有冲奶信息
+	 *
+	 * @author Moon Cheng
+	 * @param user
+	 * @return
+	 */
+	public List<MilkMakingRecord> getMilkPowderByUser(Long user);
+	
+	
+	
+	/**
+	 * 根据user查询总冲奶量和次数
+	 * @param user
+	 * @return
+	 */
+	public RecordCountInfoDTO getMilkPowderSumByUser(Long user);
+	
+	/**
+	 * 将奶粉信息插入到奶粉信息表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkPowderInfo(MilkPowderInfo entity);
+
+	/**
+	 * 通过条形码查询奶粉信息
+	 *
+	 * @author Moon Cheng
+	 * @param barCode
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkPowderInfo(String barcode);
+
+	/**
+	 * 根据品牌查询奶粉信息的系列
+	 *
+	 * @param brand
+	 * @return
+	 */
+	public List<String> selectSeries(String brand);
+
+	/**
+	 * 根据系列查询奶粉信息的段数
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectLevel(String series);
+
+	
+	/**
+	 * 根据奶粉品牌获取奶粉,详细信息
+	 * @param brand 奶粉品牌
+	 * @return 详细信息
+	 */
+	public List<MilkInfoDTO> selectMilkInfoBybrand(String brand);
+	
+	
+	/**
+	 * 根据系列查询奶粉信息
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<MilkInfoDTO> selectMilkInfo( String series);
+
+	
+
+	/**
+	 * 根据系列查询奶粉类型
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkType(String series);
+
+	/**
+	 * 根据奶粉系列查询奶粉密度
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkDensity(String series);
+
+	/**
+	 * 根据系列查询奶粉比例
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkRatio(String series);
+
+	/**
+	 * 根据系列查询奶粉id
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<Long> selectMilkId(String series);
+
+	/**
+	 * 根据系列查询奶粉的重量
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkWeightPerSpoon(String series);
+
+	/**
+	 * 查询奶粉品牌
+	 *
+	 * @return
+	 */
+	public List<String> selectMilkPowderBrand();
+
+	/**
+	 * 根据系列段数品牌获取奶粉信息
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkInfoByBrandSeriesLevel(String brand, String series, String level);
+
+	/**
+	 * 查询冲奶记录的冲奶时间
+	 *
+	 * @return
+	 */
+	public Date selectLastRecordDate();
+
+	/**
+	 * 将信息插入到冲奶记录表中
+	 *
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void insertRecordData(MilkMakingRecord milkMakingRecord);
+
+	/**
+	 * 根据用户id查询冲奶机机器码
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public List<String> getMyMachines(Long userId);
+
+	/**
+	 * milk_images表中添加数据
+	 * @param entity
+	 */
+	public void insertMilkImages(MilkImages entity);
+}

+ 34 - 0
iamberry-app-service/.svn/pristine/35/35ad3ecde3e1bbeebeed9371a7be62c1d55c260b.svn-base

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	<!-- 设置  -->
+	<settings>  
+        <!--set lazy fetching-->  
+        <setting name="lazyLoadingEnabled" value="false" />  
+        <setting name="logImpl" value="LOG4J"/>  
+		<setting name="mapUnderscoreToCamelCase" value="true" />
+		<!-- 允许使用列标签代替列名 -->  
+		<setting name="useColumnLabel" value="true" />  
+		<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->  
+		<setting name="useGeneratedKeys" value="true" />  
+    </settings>
+    
+    <!-- 配置Entitys -->
+    <typeAliases>
+    	<typeAlias type="com.iamberry.app.core.entity.Machine" alias="Machine"/>
+    	<typeAlias type="com.iamberry.app.core.entity.Message" alias="Message"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkImages" alias="MilkImages"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkMakingRecord" alias="MilkMakingRecord"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkPowderInfo" alias="MilkPowderInfo"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SharedMachine" alias="SharedMachine"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SysConfig" alias="SysConfig"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SysLog" alias="SysLog"/>
+    	<typeAlias type="com.iamberry.app.core.entity.User" alias="User"/>
+    	<typeAlias type="com.iamberry.app.core.entity.UserAvator" alias="UserAvator"/>
+    	
+    	<typeAlias type="com.iamberry.wechat.core.entity.PageBean" alias="PageBean"/>
+    	<typeAlias type="com.iamberry.app.core.serch.SerchParam" alias="SerchParam"/>
+    	<typeAlias type="com.iamberry.app.core.entity.CodeValid" alias="CodeValid"/>
+    	
+    </typeAliases>
+</configuration>

+ 275 - 0
iamberry-app-service/.svn/pristine/37/373dd0f242f036421cdc6cc08fb95e5d751f29cc.svn-base

@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MilkMapper">
+
+	<sql id="milkAttribute">
+		id,
+		volume,
+		controller,
+		stars,
+		comments,
+		brand,
+		powder_info,
+		machine_name,
+		machine,
+		user,
+		timestamp_
+	</sql>
+	
+	<sql id="powderAttribute">
+		id,
+		powder_number,
+		spoon_picture,
+		bar_code,
+		brand,
+		series,
+		level,
+		version_,
+		age_range,
+		weight_per_spoon,
+		milk_volume_per_spoon,
+		powder_ratio,
+		density,
+		type,
+		status_,
+		created_on
+	</sql>
+	
+	<resultMap type="MilkMakingRecord" id="milkMap">
+		<id property="id" column="id"/>
+		<result property="volume" column="volume"/>
+		<result property="controller" column="controller"/>
+		<result property="stars" column="stars"/>
+		<result property="comments" column="comments"/>
+		<result property="brand" column="brand"/>
+		<result property="powder_info" column="powder_info"/>
+		<result property="machine_name" column="machine_name"/>
+		<result property="machine" column="machine"/>
+		<result property="user" column="user"/>
+		<result property="timestamp_" column="timestamp_"/>
+	</resultMap>
+	
+	<resultMap type="MilkPowderInfo" id="powderMap">
+		<id property="id" column="id"/>
+		<result property="powder_number" column="powder_number"/>
+		<result property="spoon_picture" column="spoon_picture"/>
+		<result property="bar_code" column="bar_code"/>
+		<result property="brand" column="brand"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="version_" column="version_"/>
+		<result property="age_range" column="age_range"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+		<result property="milk_volume_per_spoon" column="milk_volume_per_spoon"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="density" column="density"/>
+		<result property="type" column="type"/>
+		<result property="status_" column="status_"/>
+		<result property="created_on" column="created_on"/>
+	</resultMap>
+	
+	<resultMap type="com.iamberry.app.core.dto.MilkInfoDTO" id="milkInfoDtoMap">
+		<id property="id" column="id"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="type" column="type"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+	</resultMap>
+	
+	<!-- 添加信息到milk_making_record表中 -->
+	<insert id="insertMilkMakingRecord" parameterType="MilkMakingRecord" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_MAKING_RECORD
+		(VOLUME,CONTROLLER,STARS,COMMENTS,BRAND,POWDER_INFO,MACHINE_NAME,MACHINE,USER,TIMESTAMP_) 
+		VALUES
+		(#{volume},#{controller},#{stars},#{comments},#{brand},#{powder_info},#{machine_name},#{machine},#{user},NOW())
+	</insert>
+	
+	<!-- 根据id修改MILK_MAKING_RECORD的start和comments属性 -->
+	<update id="updateMilkMakingRecord">
+		UPDATE MILK_MAKING_RECORD SET STARS = #{0}, COMMENTS = #{1} WHERE ID = #{2}
+	</update>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			user = #{5} 
+		AND 
+			machine = #{6} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMachineMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			machine = #{5} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 根据id查询MILK_MAKING_RECORD所有信息 -->
+	<select id="selectMilkMakingRecord" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据user查询所有冲奶信息 -->
+	<select id="getMilkPowderByUser" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE USER = #{0}
+	</select>
+	
+	<!-- 根据user查询总冲奶量和次数 -->
+	<select id="getMilkPowderSumByUser" parameterType="java.lang.Long" resultType="com.iamberry.app.core.dto.RecordCountInfoDTO">
+		SELECT COUNT(1) count,SUM(VOLUME) total FROM MILK_MAKING_RECORD WHERE USER = #{0} 
+	</select>
+	
+	<!-- 将奶粉信息插入到奶粉信息表中 -->
+	<insert id="insertMilkPowderInfo" parameterType="MilkPowderInfo" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_POWDER_INFO
+			(POWDER_NUMBER,SPOON_PICTURE,BAR_CODE,BRAND,SERIES,LEVEL,VERSION_,AGE_RANGE,
+			WEIGHT_PER_SPOON,MILK_VOLUME_PER_SPOON,POWDER_RATIO,DENSITY,TYPE,STATUS_,CREATED_ON) 
+		VALUES
+			(#{powder_number},#{spoon_picture},#{bar_code},#{brand},#{series},#{level},#{version_},#{age_range},#{weight_per_spoon},
+			#{milk_volume_per_spoon},#{powder_ratio},#{density},#{type},#{status_},NOW())
+	</insert>
+	
+	<!-- 通过条形码查询奶粉信息 -->
+	<select id="selectMilkPowderInfo" parameterType="java.lang.String" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BAR_CODE = #{0}  and status_='approved' 
+	</select>
+	
+	<!-- 根据品牌查询奶粉信息的系列 -->
+	<select id="selectSeries" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT 
+			series 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{brand} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息的段数 -->
+	<select id="selectLevel" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT level FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC 
+	</select>
+	
+	<!-- 根据奶粉品牌获取奶粉,详细信息 -->
+	<select id="selectMilkInfoBybrand" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			series,
+			level,
+			type,
+			id,
+			powder_ratio,
+			weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{0} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息 -->
+	<select id="selectMilkInfo" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			level,type,id,powder_ratio,weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			SERIES LIKE #{0} 
+		ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉类型 -->
+	<select id="selectMilkType" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT type FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据奶粉系列查询奶粉密度 -->
+	<select id="selectMilkDensity" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT density FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉比例 -->
+	<select id="selectMilkRatio" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT powder_ratio FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉id -->
+	<select id="selectMilkId" parameterType="java.lang.String" resultType="java.lang.Long">
+		SELECT id FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉的重量 -->
+	<select id="selectMilkWeightPerSpoon" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT weight_per_spoon FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 查询奶粉品牌 -->
+	<select id="selectMilkPowderBrand" resultType="java.lang.String">
+		SELECT brand FROM MILK_POWDER_INFO WHERE STATUS_ = 'approved' GROUP BY BRAND
+	</select>
+	
+	<!-- 根据系列段数品牌获取奶粉信息 -->
+	<select id="selectMilkInfoByBrandSeriesLevel" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BRAND = #{0} AND SERIES = #{1} AND LEVEL = #{2} 
+	</select>
+	
+	<!-- 查询冲奶记录的冲奶时间 -->
+	<select id="selectLastRecordDate" resultType="java.util.Date">
+		SELECT timestamp_ FROM MILK_MAKING_RECORD WHERE CONTROLLER = 'machine' ORDER BY ID DESC LIMIT 1 
+	</select>
+	
+	<!-- 根据用户id查询冲奶机机器码 -->
+	<select id="getMyMachines" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT machine_mac FROM MACHINE WHERE OWNER = #{0}
+	</select>
+	
+	<!-- 将信息插入到冲奶记录表中 -->
+	<insert id="insertRecordData" parameterType="MilkMakingRecord">
+		INSERT INTO milk_making_record (volume, controller, machine, timestamp_, user) VALUE (#{volume}, 'machine', #{machine}, #{timestamp_}, #{user})
+	</insert>
+	
+	<!-- milk_images表中添加数据 -->
+	<insert id="insertMilkImages" parameterType="MilkImages" useGeneratedKeys="true" keyProperty="image_id">
+		INSERT INTO MILK_IMAGES
+		(
+			IMAGE_MILK_ID,IMAGE_FRONT,IMAGE_BAR,IMAGE_FEED
+		) 
+		VALUES 
+		(
+			#{image_Milk_ID},#{image_Front},#{image_Bar},#{image_Feed}
+		)
+	</insert>
+</mapper>

+ 28 - 0
iamberry-app-service/.svn/pristine/38/3849d89ceb4b15187eea4a77937957b86ec9ea5c.svn-base

@@ -0,0 +1,28 @@
+package com.iamberry.app.service;
+
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.core.entity.SysLog;
+import com.iamberry.app.face.LogService;
+
+/**
+ * LogService
+ * 
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午2:34:45
+ */
+@Service
+public class LogServiceImpl extends BaseService implements LogService  {
+
+	/**
+	 * saveSystemLog
+	 * 
+	 * @author Moon Cheng
+	 * @param log
+	 * @return
+	 */
+	public SysLog saveSystemLog(SysLog log) {
+		logMapper.insertSysLog(log);
+		return log;
+	}
+}

+ 36 - 0
iamberry-app-service/.svn/pristine/3a/3a5118c7ba0d99778452c001d7849bfb4281804e.svn-base

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>iamberry-app-service</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>

+ 42 - 0
iamberry-app-service/.svn/pristine/3c/3cea7ce6332778f5a41903a41ebbe8243da50115.svn-base

@@ -0,0 +1,42 @@
+#levels: debug, info, warn, error, fatal
+log4j.rootLogger=info,stdout,infoLog,errorLog,dbLog
+
+#\u63a7\u5236\u53f0
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
+
+#\u4e3b\u65e5\u5fd7\u6587\u4ef6
+log4j.appender.infoLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.infoLog.File=D:/log/iamberry/app/iamberry_info.log
+log4j.appender.infoLog.Append=true
+log4j.appender.infoLog.Threshold=INFO
+log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.infoLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.infoLog.encoding=UTF-8
+
+#\u9519\u8bef\u65e5\u5fd7
+log4j.appender.errorLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.errorLog.File=D:/log/iamberry/app/iamberry_error.log
+log4j.appender.errorLog.Append=true
+log4j.appender.errorLog.Threshold=ERROR
+log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.errorLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.errorLog.encoding=UTF-8
+
+#debug\u4FE1\u606F
+log4j.appender.dbLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.dbLog.File=D:/log/iamberry/app/iamberry_debug.log
+log4j.appender.dbLog.Append=true
+log4j.appender.dbLog.Threshold=DEBUG
+log4j.appender.dbLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.dbLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.dbLog.encoding=UTF-8
+
+#\u663e\u793aSQL\u8bed\u53e5\u90e8\u5206
+log4j.logger.com.iamberry.app=DEBUG
+log4j.logger.java.sql.ResultSet=INFO
+log4j.logger.java.sql.Connection=DEBUG
+log4j.logger.java.sql.Statement=DEBUG
+log4j.logger.java.sql.PreparedStatement=DEBUG

+ 112 - 0
iamberry-app-service/.svn/pristine/4a/4a804bee65556b4cae520706c2c66ce04ba4d982.svn-base

@@ -0,0 +1,112 @@
+package com.iamberry.app.start;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.support.AbstractApplicationContext;
+
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.ulitity.Utility;
+
+@ImportResource("classpath:iamberry-app-service-spring.xml")
+@SpringBootApplication
+public class InitApp {
+    @Bean
+    public CountDownLatch closeLatch() {
+        return new CountDownLatch(1);
+    }
+	public static void main(String[] args) throws Exception {
+		AbstractApplicationContext ctx = (AbstractApplicationContext) new SpringApplicationBuilder().sources(InitApp.class).web(false).run(args);
+		CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
+		
+		// 获取
+		UserService milkService = ctx.getBean(UserService.class);
+		/*UserMapper userMapper = ctx.getBean(UserMapper.class);
+		int pageNO = 0;
+		boolean flag = true;
+		while (flag) {
+			// 查询第一页的数据,直接页数
+			int start = pageNO * 100;
+			int end = 100;
+			// 下一次查询
+			pageNO++;
+
+			// 获取一页的数据
+			List<User> users = milkService.getAll(start, end);
+			for (User user : users) {
+				// 判断用户是第三方登录,还是自己注册的
+				if (StringUtils.isEmpty(user.getExt_type())) {
+					// 使用手机号码注册
+					if (StringUtils.isNotEmpty(user.getUserTel())) {
+					} else {
+
+						// 判断是否拥有宝宝信息,如果拥有宝宝信息,那么账户正常,否则需要完善宝宝信息
+						user.setStatus_("SAVE_TEL");
+						
+						if (user.getBaby_nickname() != null) {
+							user.setStatus_("active");
+						} else {
+							if (user.getBaby_dob() != null && user.getBaby_dob().getTime() > 0) {
+								System.out.println("数据一致" + Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1").getTime() + "=" + user.getBaby_gender());
+								user.setStatus_("active");
+							}
+						}
+						
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setUserTel(user.getUsername());
+						temp.setStatus_(user.getStatus_());
+						userMapper.updateUser(temp);
+						System.out.println("修改自己注册的用户:" + user);
+					}
+				} else {
+					// 第三方注册
+					
+					// username是否是手机号码,如果是手机号码,那么把保存到user_tel,并且状态更新为SAVE_TEL,否则NOW_INIT
+					if (user.getUsername().length() == 11) {
+						user.setUserTel(user.getUsername());
+						user.setStatus_("SAVE_TEL");
+						// 宝宝信息是否存在,如果存在,那么状态为active,否则为
+						if (user.getBaby_nickname() != null) {
+							user.setStatus_("active");
+						} else {
+							if (user.getBaby_dob() != null && user.getBaby_dob().getTime() > 0) {
+								System.out.println("数据一致" + Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1").getTime() + "=" + user.getBaby_gender());
+								user.setStatus_("active");
+							}
+						}
+						
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setUserTel(user.getUserTel());
+						temp.setStatus_(user.getStatus_());
+						temp.setUsername(user.getExt_open_id());
+						userMapper.updateUser(temp);
+					} else {
+						user.setStatus_("NOW_INIT");
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setStatus_(user.getStatus_());
+						temp.setUsername(user.getExt_open_id());
+						userMapper.updateUser(temp);
+					}
+					System.out.println("修改第三方注册的用户:" + user);
+				}
+			}
+			if (users.size() < 100) {
+				// 停止
+				flag = false;
+			}
+		}*/
+		closeLatch.await();
+	}
+}

+ 132 - 0
iamberry-app-service/.svn/pristine/4b/4bd7ebde68ab0194a2d2364a8672e2b7b2ded279.svn-base

@@ -0,0 +1,132 @@
+package com.iamberry.app.service;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.core.entity.Message;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.core.serch.SerchParam;
+import com.iamberry.app.face.MessageService;
+import com.iamberry.wechat.core.entity.PageBean;
+
+/**
+ * LogService
+ * 
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午2:34:45
+ */
+@Service
+public class MessageServiceImpl extends BaseService implements MessageService  {
+
+	/**
+	 * 查询符合条件的用户列表
+	 * @return
+	 */
+	public List<User> selectUser(PageBean page){
+		page.initRecordBegin();
+		return messageMapper.selectUser(page);
+	}
+	
+	/**
+	 * 获取用户总条数
+	 * @return
+	 */
+	public int selectUserCount(SerchParam params){
+		return messageMapper.selectUserCount(params);
+	}
+
+	
+	/**
+	 * 修改一条消息
+	 * @return 影响的行数
+	 */
+	public int updateMessage(Message message){
+		return messageMapper.updateMessage(message);
+	}
+	
+	/**
+	 * 添加一条消息
+	 * @return 影响的行数
+	 */
+	public int insertMessage(Message message){
+		message.setCreate_date(new Date());//添加时间
+		message.setIs_read(Long.valueOf("2"));//未读
+		return messageMapper.insertMessage(message);
+	}
+	
+	/**
+	 * 获取符合条件所有消息的总条数
+	 * @return 所有的消息条数
+	 */
+	public int selectMessageCount(SerchParam params){
+		return messageMapper.selectMessageCount(params);
+	}
+	
+	/**
+	 * 获取符合条件所有消息
+	 * @return 所有的消息
+	 */
+	public List<Message> selectMessageRecoreds(PageBean page){
+		page.initRecordBegin();
+		return messageMapper.selectMessageRecoreds(page);
+	}
+
+	
+	/**
+	 * 获取系统的所有消息
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectSysMessageRecoreds(){
+		return messageMapper.selectSysMessageRecoreds();
+	}
+	
+	/**
+	 * 根据信息id获取信息实体类
+	 * @param id 信息id
+	 * @return 信息实体类
+	 */
+	public Message selectUserMessageByid(Long id){
+		Message message = messageMapper.selectUserMessageByid(id);
+		if (message == null) {
+			return null;
+		}
+		//修改为已读
+		message.setRead_date(new Date());
+		message.setIs_read(Long.valueOf("1"));
+		messageMapper.updateMessage(message);
+		return message;
+	}
+	
+	/**
+	 * 根据用户id获取该用户的所有消息
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectUserMessageRecoreds(String token){
+		
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		return messageMapper.selectUserMessageRecoreds(userInfo.getId());
+	}
+	
+	/**
+	 * 获取用户消息
+	 * @param userid 用户id 
+	 * @param isread 1已读,2 未读
+	 * @return 用户消息集合
+	 */
+	public int selectUserMessageByisread(String token,
+			 Long isread){
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		
+		return messageMapper.selectUserMessageByisread(userInfo.getId(),isread);
+	}
+}

+ 51 - 0
iamberry-app-service/.svn/pristine/4e/4ec520dd2e95ae6506336280699159e29fd1caf3.svn-base

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xmlns:aop="http://www.springframework.org/schema/aop"
+	   xmlns:context="http://www.springframework.org/schema/context"
+	   xmlns:tx="http://www.springframework.org/schema/tx"
+	   xmlns:p="http://www.springframework.org/schema/p"
+	   xsi:schemaLocation="http://www.springframework.org/schema/beans
+					http://www.springframework.org/schema/beans/spring-beans.xsd
+					http://www.springframework.org/schema/aop
+					http://www.springframework.org/schema/aop/spring-aop.xsd
+					http://www.springframework.org/schema/context
+					http://www.springframework.org/schema/context/spring-context.xsd
+					http://www.springframework.org/schema/tx
+					http://www.springframework.org/schema/tx/spring-tx.xsd">
+					
+	<bean id="jdbcUrlBean" class="com.iamberry.wechat.tools.DataSourceManager"></bean>
+
+    <!--app 前台配置库数据源-->
+    <bean id="ratfwDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
+		<property name="driverClass" value="#{jdbcUrlBean.jdbcDriver}"></property>
+		<property name="jdbcUrl" value="#{jdbcUrlBean.jdbcUrl}"></property>
+		<property name="user" value="#{jdbcUrlBean.jdbcUserName}"></property>
+		<property name="password" value="#{jdbcUrlBean.jdbcPassword}"></property>
+		<!--连接池初始化值 -->
+		<property name="initialPoolSize" value="3"></property>
+		<!--连接池最大值 -->
+		<property name="maxPoolSize" value="#{jdbcUrlBean.maxPoolSize}"></property>
+		<!--最小空闲值,当空闲连接少于阀值时,连接池会预申请一些连接 -->
+		<property name="minPoolSize" value="2"></property>
+	</bean>
+	
+	<!-- 自动扫描SQL隐射文件 -->
+	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+		<!-- basePackage:指定SQL映射文件、接口的包,自动加载SQL映射文件和接口 -->
+		<property name="basePackage" value="com.iamberry.app.mapper"></property>
+		<!-- 引用SQLSessionFactoryBean -->
+		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
+	</bean>
+	
+	<!-- 配置SqlSessionFactoryBean -->
+	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
+		<!-- 配置数据源 -->
+		<property name="dataSource" ref="ratfwDataSource" />
+		<property name="configLocation" value="classpath:iamberry-app-service-mybatis.xml" />
+		<property name="mapperLocations" value="classpath:com/iamberry/app/mapper/*.xml" />
+	</bean>
+	
+	<!-- 开启注解事务 -->
+	<tx:annotation-driven transaction-manager="transactionManager"/>
+</beans>

+ 214 - 0
iamberry-app-service/.svn/pristine/56/5632411515b04419b9ef7ee5140ad8786dad7def.svn-base

@@ -0,0 +1,214 @@
+package com.iamberry.app.service;
+
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.face.CodeService;
+import com.iamberry.app.mapper.CodeMapper;
+import com.iamberry.app.tool.util.Result;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.ResponseJson;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码业务实现类
+ */
+@Service
+public class CodeServiceImpl implements CodeService {
+
+	@Autowired
+	private CodeMapper codeMapper;
+
+	@Override
+	public ResponseJson sendCode(String phone, int codeScenario) {
+		// TODO Auto-generated method stub
+		// 第一步,判断使用通道,如果是+86开头,优先使用国内通道,否则默认使用国外通道
+		ResponseJson json = new ResponseJson();
+		if (StringUtils.isEmpty(phone)) {
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Phone Empty!");
+			return json;
+		}
+		
+		// 第二步,如果是国内,判断是否存在
+		CodeValid codeValid = codeMapper.getLast(phone);
+		
+		// 通道是否是中国的
+		boolean IS_CHANNEL_ZH = false;
+		if (StringUtils.indexOf(phone, "+") != -1) {
+			if (StringUtils.startsWith(phone, "+86")) {
+				IS_CHANNEL_ZH = true;
+			}
+		} else {
+			IS_CHANNEL_ZH = true;
+		}
+		// 判断通道
+		Date now = new Date();
+		if (IS_CHANNEL_ZH && codeValid != null) {
+			// ** 切换通道需求:每次请求验证码,如果上一次验证码在一分钟以后,三分钟以内没有使用,那么切换通道 **//
+			if (now.getTime() <= (codeValid.getCodeValidDate().getTime()) && 
+					(now.getTime() - 60000) >= codeValid.getCodeSendDate().getTime() && codeValid.getCodeUse() == 2 && codeValid.getCodeScenario() == codeScenario) {
+				// 如果等待三分钟后,那么切换通道,暂时不切换
+//				IS_CHANNEL_ZH = false;
+			}
+		}
+		// 获取验证码
+		String code = Utility.getRandomCode(4);
+		json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		if (json.getReturnCode() != 200) {
+			json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		}
+		// 保存发送记录
+		codeValid = new CodeValid();
+		codeValid.setCodeChannel(IS_CHANNEL_ZH ? 1 : 2);
+		codeValid.setCodeMsg(json.getReturnMsg().get("returnMsg").toString());
+		codeValid.setCodePhone(phone);
+		codeValid.setCodeScenario(codeScenario);
+		codeValid.setCodeSendDate(now);
+		codeValid.setCodeValidDate(new Date(now.getTime() + 180000));
+		codeValid.setCodeStatus(json.getReturnCode() == 200 ? 3 : 4);
+		codeValid.setCodeUse(2);
+		codeValid.setCodeValue(Integer.parseInt(code));
+		codeMapper.save(codeValid);
+		return json;
+	}
+	
+	/**
+	 * @param phone		手机号码
+	 * @param code		短信验证码
+	 * @param channel	通道 1:主通道;2:备用通道(国外的电话通通使用此)
+	 * @return
+	 */
+	private ResponseJson sendCMS(String phone, String code, int channel) {
+		
+		// 国内号码
+		ResponseJson json = new ResponseJson();
+		json.setReturnCode(500);
+		String result = null;
+		try {
+			if (channel == 1) {
+				// 使用主通道
+				result = sendZHCMS(phone, code);
+			} else {
+				// 使用备用通道
+				result = sendOtherCMS(phone, code);
+			}
+		} catch (Exception e) {
+			result = e.getMessage();
+		}
+		if (StringUtils.equals(result, "SUCCESS")) {
+			json.setReturnCode(200);
+		}
+		json.addResponseKeyValue(result);
+		return json;
+	}
+	
+	private String sendOtherCMS(String phone, String code) {
+		System.out.println("使用备用通道,发送验证码成功!" + code);
+		return "SUCCESS";
+	}
+	
+	private String sendZHCMS(String phone, String code) throws Exception {
+
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phone);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close();
+			if (0 == object.getResultcode()) {
+				return "SUCCESS";
+			} else {
+				return object.getResultcode() + ":" + object.getErrordescription();
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public ResponseJson validCode(String phone, String code, int codeScenario) {
+		ResponseJson json = new ResponseJson();
+		// 校验
+		CodeValid codeValid = codeMapper.getLast(phone);
+		if (codeValid == null) {
+			// 操作有误
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Wrong operation, No send record");
+			return json;
+		}
+		Date now = new Date();
+		if (now.getTime() >= codeValid.getCodeValidDate().getTime()) {
+			// 验证码无效
+			json.setReturnCode(403);
+			json.addResponseKeyValue("Verification code is invalid");
+			return json;
+		}
+		// 验证码是否使用 1:已经使用;2:未使用
+		if (codeValid.getCodeUse().intValue() == 1) {
+			// 验证码无效
+			json.setReturnCode(402);
+			json.addResponseKeyValue("Verification code has been used");
+			return json;
+		}
+		// 必须 验证码正确,并且场景正确
+		if (!(codeValid.getCodeValue() == (Integer.parseInt(code)) 
+				&& codeScenario == codeValid.getCodeScenario())) {
+			// 验证码错误
+			json.setReturnCode(405);
+			json.addResponseKeyValue("Verification code error");
+			return json;
+		}
+		// 只要校验成功,表示本次验证码已使用
+		codeMapper.update(codeValid.getCodeId());
+		json.setReturnCode(200);
+		json.addResponseKeyValue("SUCCESS");
+		return json;
+	}
+}

+ 322 - 0
iamberry-app-service/.svn/pristine/61/61e4d3ff2092231f7493a1795875b34a8ab54e32.svn-base

@@ -0,0 +1,322 @@
+package com.iamberry.app.service;
+
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_KEY;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Response;
+import com.iamberry.app.config.ResponseHeader;
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.face.CodeService;
+import com.iamberry.app.mapper.CodeMapper;
+import com.iamberry.app.tool.util.Result;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.ResponseJson;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码业务实现类
+ */
+@Service
+public class CodeServiceImpl implements CodeService {
+
+	@Autowired
+	private CodeMapper codeMapper;
+	private static String ENCODING = "UTF-8";
+
+	@Override
+	public ResponseJson sendCode(String phone, int codeScenario) {
+		// TODO Auto-generated method stub
+		// 第一步,判断使用通道,如果是+86开头,优先使用国内通道,否则默认使用国外通道
+		ResponseJson json = new ResponseJson();
+		if (StringUtils.isEmpty(phone)) {
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Phone Empty!");
+			return json;
+		}
+		
+		// 第二步,如果是国内,判断是否存在
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		 
+		// 通道是否是中国的
+		boolean IS_CHANNEL_ZH = false;
+		if (StringUtils.indexOf(phone, "+") != -1) {
+			if (StringUtils.startsWith(phone, "+86")) {
+				IS_CHANNEL_ZH = true;
+			}
+		} else {
+			IS_CHANNEL_ZH = true;
+		}
+		// 判断通道
+		if (IS_CHANNEL_ZH && codeValid != null) {
+			// ** 切换通道需求:每次请求验证码,如果上一次验证码在一分钟以后,三分钟以内没有使用,那么切换通道 **//
+			if (now.getTime() <= (codeValid.getCodeValidDate().getTime()) && 
+					(now.getTime() - 60000) >= codeValid.getCodeSendDate().getTime() && codeValid.getCodeUse() == 2 && codeValid.getCodeScenario() == codeScenario) {
+				// 如果等待三分钟后,那么切换通道,暂时不切换
+//				IS_CHANNEL_ZH = false;
+			}
+		}
+		// 获取验证码
+		String code = Utility.getRandomCode(4);
+		json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		if (json.getReturnCode() != 200) {
+			json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		}
+		// 保存发送记录
+		codeValid = new CodeValid();
+		codeValid.setCodeChannel(IS_CHANNEL_ZH ? 1 : 2);
+		codeValid.setCodeMsg(json.getReturnMsg().get("returnMsg").toString());
+		codeValid.setCodePhone(phone);
+		codeValid.setCodeScenario(codeScenario);
+		codeValid.setCodeSendDate(now);
+		codeValid.setCodeValidDate(new Date(now.getTime() + 180000));
+		codeValid.setCodeStatus(json.getReturnCode() == 200 ? 3 : 4);
+		codeValid.setCodeUse(2);
+		codeValid.setCodeValue(Integer.parseInt(code));
+		codeMapper.save(codeValid);
+		return json;
+	}
+	
+	/**
+	 * @param phone		手机号码
+	 * @param code		短信验证码
+	 * @param channel	通道 1:主通道;2:备用通道(国外的电话通通使用此)
+	 * @return
+	 */
+	private ResponseJson sendCMS(String phone, String code, int channel) {
+		
+		// 国内号码
+		ResponseJson json = new ResponseJson();
+		json.setReturnCode(500);
+		String result = null;
+		try {
+			if (channel == 1) {
+				// 使用主通道
+//				result = sendZHCMS(phone, code);
+				result = sendOtherCMS(phone, code);
+			} else {
+				// 使用备用通道
+				result = sendOtherCMS(phone, code);
+			}
+		} catch (Exception e) {
+			result = e.getMessage();
+		}
+		if (StringUtils.equals(result, "SUCCESS")) {
+			json.setReturnCode(200);
+		}
+		json.addResponseKeyValue(result);
+		return json;
+	}
+	
+	private String sendOtherCMS(String phone, String code) {
+		String text = MessageFormat.format(INTER_SMS_TEXT, code);
+		String results = sendSms(text, phone);
+        JSONObject json =  JSONObject.fromObject(results);
+        String resultcod  = json.get("code").toString();
+        if(resultcod.equals("0")){
+        	System.out.println("使用备用通道,发送验证码成功!" + code);
+        	return "SUCCESS";
+        }else{
+        	System.out.println("使用备用通道,发送失败...!" + code);
+        	return results;
+        }
+		
+	}
+
+	public static String sendSms(String text, String mobile)  {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", INTER_SMS_KEY);
+        params.put("text", text);
+        params.put("mobile", mobile);
+        return post(INTER_SMS_URL, params);
+    }
+
+	 /** 基于HttpClient 4.3的通用POST方法
+    * @param url       提交的URL
+    * @param paramsMap 提交<参数,值>Map
+    * @return 提交响应
+    */
+    public static String post(String url, Map<String, String> paramsMap) {
+    	
+        CloseableHttpClient client = HttpClients.createDefault();
+        String responseText = "";
+        CloseableHttpResponse response = null;
+            try {
+                HttpPost method = new HttpPost(url);
+                if (paramsMap != null) {
+                    List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+                    for (Map.Entry<String, String> param : paramsMap.entrySet()) {
+                        NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+                        paramList.add(pair);
+                    }
+                    method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
+                }
+                response = client.execute(method);
+                HttpEntity entity = response.getEntity();
+                if (entity != null) {
+                    responseText = EntityUtils.toString(entity);
+                }
+                
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    response.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            return responseText;
+        }
+
+	private String sendZHCMS(String phone, String code) throws Exception {
+
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phone);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close();
+			if (0 == object.getResultcode()) {
+				return "SUCCESS";
+			} else {
+				return object.getResultcode() + ":" + object.getErrordescription();
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public ResponseJson validCode(String phone, String code, int codeScenario) {
+		ResponseJson json = new ResponseJson();
+		// 校验
+		CodeValid codeValid = codeMapper.getLast(phone);
+		if (codeValid == null) {
+			// 操作有误
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Wrong operation, No send record");
+			return json;
+		}
+		Date now = new Date();
+		if (now.getTime() >= codeValid.getCodeValidDate().getTime()) {
+			// 验证码无效
+			json.setReturnCode(403);
+			json.addResponseKeyValue("Verification code is invalid");
+			return json;
+		}
+		// 验证码是否使用 1:已经使用;2:未使用
+		if (codeValid.getCodeUse().intValue() == 1) {
+			// 验证码无效
+			json.setReturnCode(402);
+			json.addResponseKeyValue("Verification code has been used");
+			return json;
+		}
+		// 必须 验证码正确,并且场景正确
+		if (!(codeValid.getCodeValue() == (Integer.parseInt(code)) 
+				&& codeScenario == codeValid.getCodeScenario())) {
+			// 验证码错误
+			json.setReturnCode(405);
+			json.addResponseKeyValue("Verification code error");
+			return json;
+		}
+		// 只要校验成功,表示本次验证码已使用
+		codeMapper.update(codeValid.getCodeId());
+		json.setReturnCode(200);
+		json.addResponseKeyValue("SUCCESS");
+		return json;
+	}
+	
+	/**
+	 * 放轰炸原则:
+	 * 	1、每个手机号码,每60秒只能发送1次!
+	 * 	2、每个手机号码,每小时只能发送三次!
+	 *  3、每个手机号码,每天只能发送10次!
+	 * @param phone
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public Response interval(String phone) {
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		
+		// 每个手机号,限制每60秒,只能发送一次
+		if (codeValid != null && (60000 > (now.getTime() - codeValid.getCodeSendDate().getTime()))) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每60秒只能发送1次!", 0));
+		}
+		
+		// 生成时间规则
+		Date startDate = new Date();
+		startDate.setMinutes(0);
+		startDate.setSeconds(0);
+		Date endDate = new Date();
+		endDate.setMinutes(59);
+		endDate.setSeconds(60);
+		
+		// 每个手机号码,每个小时最多3条
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 3) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每小时只能发送3次!", 0));
+		}
+		
+		// 每个手机号码,每天最多10条
+		endDate.setHours(23);
+		startDate.setHours(0);
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 10) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每天只能发送10次!", 0));
+		}
+		
+		return new Response(new ResponseHeader(200, "SUCCESS", 0));
+	}
+	
+}

+ 258 - 0
iamberry-app-service/.svn/pristine/67/6793b7a7549090357c347172949d656341bd2078.svn-base

@@ -0,0 +1,258 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectKey;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.entity.MilkDatetimeValue;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.sqlprovider.DMLProvider;
+
+public interface MilkMapper {
+
+	/**
+	 * 添加信息到milk_making_record表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkMakingRecord(MilkMakingRecord entity);
+
+	/**
+	 * 根据id修改MILK_MAKING_RECORD的start和comments属性
+	 *
+	 * @param stars
+	 * @param comments
+	 * @param id
+	 */
+	public void updateMilkMakingRecord(int stars, String comments, Long id);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param userId
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, Long userId, String devId);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param devids
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMachineMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, String devids);
+
+	/**
+	 * 根据id查询MILK_MAKING_RECORD所有信息
+	 *
+	 * @author Moon Cheng
+	 * @param id
+	 * @return
+	 */
+	public MilkMakingRecord selectMilkMakingRecord(Long id);
+
+	/**
+	 * 根据user查询所有冲奶信息
+	 *
+	 * @author Moon Cheng
+	 * @param user
+	 * @return
+	 */
+	public List<MilkMakingRecord> getMilkPowderByUser(Long user);
+	
+	
+	
+	/**
+	 * 根据user查询总冲奶量和次数
+	 * @param user
+	 * @return
+	 */
+	public RecordCountInfoDTO getMilkPowderSumByUser(Long user);
+	
+	/**
+	 * 将奶粉信息插入到奶粉信息表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkPowderInfo(MilkPowderInfo entity);
+
+	/**
+	 * 通过条形码查询奶粉信息
+	 *
+	 * @author Moon Cheng
+	 * @param barCode
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkPowderInfo(String barcode);
+
+	/**
+	 * 根据品牌查询奶粉信息的系列
+	 *
+	 * @param brand
+	 * @return
+	 */
+	public List<String> selectSeries(String brand);
+
+	/**
+	 * 根据系列查询奶粉信息的段数
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectLevel(String series);
+
+	
+	/**
+	 * 根据奶粉品牌获取奶粉,详细信息
+	 * @param brand 奶粉品牌
+	 * @return 详细信息
+	 */
+	public List<MilkInfoDTO> selectMilkInfoBybrand(String brand);
+	
+	
+	/**
+	 * 根据系列查询奶粉信息
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<MilkInfoDTO> selectMilkInfo( String series);
+
+	
+
+	/**
+	 * 根据系列查询奶粉类型
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkType(String series);
+
+	/**
+	 * 根据奶粉系列查询奶粉密度
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkDensity(String series);
+
+	/**
+	 * 根据系列查询奶粉比例
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkRatio(String series);
+
+	/**
+	 * 根据系列查询奶粉id
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<Long> selectMilkId(String series);
+
+	/**
+	 * 根据系列查询奶粉的重量
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkWeightPerSpoon(String series);
+
+	/**
+	 * 查询奶粉品牌
+	 *
+	 * @return
+	 */
+	public List<String> selectMilkPowderBrand();
+
+	/**
+	 * 根据系列段数品牌获取奶粉信息
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkInfoByBrandSeriesLevel(String brand, String series, String level);
+
+	/**
+	 * 查询冲奶记录的冲奶时间
+	 *
+	 * @return
+	 */
+	public Date selectLastRecordDate();
+
+	/**
+	 * 将信息插入到冲奶记录表中
+	 *
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void insertRecordData(MilkMakingRecord milkMakingRecord);
+
+	/**
+	 * 根据用户id查询冲奶机机器码
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public List<String> getMyMachines(Long userId);
+
+	/**
+	 * milk_images表中添加数据
+	 * @param entity
+	 */
+	public void insertMilkImages(MilkImages entity);
+	
+	/**
+	 * 根据时间、机器号,获取数据
+	 * @param mac
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public List<MilkDatetimeValue> getMilkRecordByTime(@Param("mac") String mac, @Param("start") Date startDate, @Param("end") Date endDate);
+	
+	/**
+	 * 根据日期统计数据
+	 * @param mac
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public List<MilkDatetimeValue> getMilkRecordByDate(@Param("year")boolean isYear, @Param("mac") String mac, @Param("start") Date startDate, @Param("end") Date endDate);
+}

+ 161 - 0
iamberry-app-service/.svn/pristine/68/68044b5072200d8a307dd1ae37e679d11dbe46ee.svn-base

@@ -0,0 +1,161 @@
+package com.iamberry.app.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.User;
+
+/**
+ *
+ * @author Moon Cheng
+ * @date 2016年1月16日 下午12:25:05
+ */
+public interface UserMapper {
+
+	// ================================================================================================
+	// ------------------------------------------User----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 根据id查询user所有信息
+	 *
+	 * @param id
+	 * @return User Information
+	 */
+	public User selectUserById(Long id);
+
+	/**
+	 * 根据username查询user所有信息
+	 *
+	 * @param username
+	 * @return User Information
+	 */
+	public User selectUserByUsername(String username);
+
+	/**
+	 * 通过ext_open_id查询user所有信息
+	 *
+	 * @param extOpenId
+	 * @return User Information
+	 */
+	public User selectUserByExtOpenId(String extOpenId);
+
+	/**
+	 * 添加用户信息到user表中
+	 *
+	 * @param user
+	 */
+	public void insertUser(User user);
+
+	/**
+	 * 根据id修改user表数据
+	 *
+	 * @param user
+	 */
+	public int updateUser(User user);
+
+	/**
+	 * 根据id修改user表的个人头像
+	 *
+	 * @author Moon Cheng
+	 * @param image
+	 * @param id
+	 */
+	public int updateDisplayPicture(String imageUrl, Long id);
+
+	/**
+	 * 根据用户名和密码查询用户表信息
+	 *
+	 * @param username
+	 * @param password
+	 * @return User Information
+	 */
+	public User validateUser(String username, String password);
+
+	/**
+	 * 通过id修改用户表密码
+	 *
+	 * @param id
+	 * @param newPassword
+	 * @return update row count
+	 */
+	public int changePassword(Long id, String newPassword);
+
+	// ================================================================================================
+	// ------------------------------------------UserToken----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 通过token查询user表所有信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public User selectUserByToken(String token);
+
+	/**
+	 * 根据id修改token值
+	 *
+	 * @param token
+	 * @param userId
+	 * @return int
+	 */
+	public int updateUserToken(String token, Long userId);
+
+	/**
+	 * 根据id修改user表的用户名
+	 *
+	 * @author Moon Cheng
+	 * @param username
+	 * @param userId
+	 * @return
+	 */
+	public int updateUserName(String username, Long userId);
+
+	/**
+	 * 通过key_查询sys_config表数据
+	 *
+	 * @param key
+	 * @return String
+	 */
+	public String selectConfig(String key);
+
+	// ================================================================================================
+	// ------------------------------------------UserAvator----------------------------------------------
+	// ================================================================================================
+	/**
+	 * USER_AVATOR表中添加数据
+	 *
+	 * @param id
+	 * @param avator
+	 *            void
+	 */
+	public void insertUserAvator(Long id, String avator);
+
+	/**
+	 * 通过user_id修改USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @param avator
+	 * @return int
+	 */
+	public int updateUserAvator(Long id, String avator);
+
+	/**
+	 * 根据user_id查询USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @return String
+	 */
+	public String selectUserAvator(Long id);
+	
+	@Deprecated
+	public java.util.List<User> getAll(@Param("start") int start, @Param("end") int end);
+
+	/**
+	 * 根据手机号码,获取用户信息,但是排除指定的用户ID
+	 * @param phone
+	 * @param userId
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月21日
+	 */
+	public User getOtherUserByTel(@Param("phone") String phone, @Param("userId") Integer userId);
+}

+ 124 - 0
iamberry-app-service/.svn/pristine/6a/6a7a0da8fe56e31789acad87e32b6a1fa757d6dd.svn-base

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MachineMapper">
+	<sql id="allMachineField">
+		ID,
+		OWNER,
+		MACHINE_NAME,
+		MACHINE_MAC,
+		MACHINE_INFO,
+		STATUS_,
+		LOCATION,
+		CREATED_ON
+	</sql>
+	
+	<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
+    <resultMap type="Machine" id="machineMap">
+        <!-- 用id属性来映射主键字段 -->
+        <id property="id" column="id"/>
+        <!-- 用result属性来映射非主键字段 -->
+        <result property="owner" column="owner"/>
+        <result property="machine_name" column="machine_name"/>
+        <result property="machine_mac" column="machine_mac"/>
+        <result property="machine_info" column="machine_info"/>
+        <result property="status_" column="status_"/>
+        <result property="location" column="location"/>
+        <result property="created_on" column="created_on"/>
+    </resultMap>
+    
+    
+	<!-- 添加一台机器 -->
+	<insert id="insertMachine" parameterType="Machine"
+		useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MACHINE 
+			(MACHINE_NAME,MACHINE_MAC,MACHINE_INFO,OWNER,STATUS_,LOCATION,CREATED_ON)
+		VALUES
+			(
+				#{machine_name},#{machine_mac},#{machine_info},#{owner}
+				,#{status_},#{location},#{created_on}
+			)
+	</insert>
+
+	<!-- 根据id 修改一台机器信息  -->
+	<update id="updateMachine" parameterType="Machine">
+		UPDATE MACHINE
+		<set>
+			<if test="owner != null and owner != ''">
+				OWNER=#{owner},
+			</if>
+			<if test="machine_name != null and machine_name != ''">
+				MACHINE_NAME=#{machine_name},
+			</if>
+			<if test="machine_mac != null and machine_mac != ''">
+				MACHINE_MAC=#{machine_mac},
+			</if>
+			<if test="machine_info != null and machine_info != ''">
+				MACHINE_INFO=#{machine_info},
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_=#{status_},
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION=#{location},
+			</if>
+			<if test="created_on != null and created_on != ''">
+				CREATED_ON=#{created_on},
+			</if>
+		</set>
+		WHERE ID=#{id}
+	</update>
+	
+	<!-- 根据id 修改一台机器的状态-->
+	<update id="updateMachineStatus" parameterType="Machine">
+		UPDATE MACHINE 
+		SET STATUS_ = #{0},CREATED_ON = NOW() 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 根据机器码 修改一台机器的状态-->
+	<update id="updateStatusByMac">
+		UPDATE MACHINE 
+		SET STATUS_ = #{1},CREATED_ON = NOW() 
+		WHERE machine_mac = #{0}
+	</update>
+	
+	<!-- 根据id 修改一台机器的位置信息-->
+	<update id="updateMachineLocation" parameterType="Machine">
+		UPDATE MACHINE 
+		SET LOCATION = #{0} 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 按用户,查询所有机器 -->
+	<select id="selectMachineByOwner" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE OWNER = #{owner}
+	</select>
+	
+	<!-- 根据id 查询一台机器 -->
+	<select id="selectMachineById" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE ID = #{id}
+	</select>
+	
+	<!-- 根据机器码和所属用户 查一台机器id -->
+	<select id="isDevUserPairExist" resultType="Long">
+		SELECT ID
+		FROM MACHINE WHERE  MACHINE_MAC = #{0} AND OWNER = #{1}
+	</select>
+	
+	<!-- 根据机器的ID,查询最近的一个用户ID -->
+	<select id="selectUserIDByDevId" parameterType="String" resultType="Long">
+		SELECT OWNER 
+		FROM MACHINE 
+		WHERE MACHINE_MAC = #{devid} ORDER BY id DESC LIMIT 0, 1
+	</select>
+</mapper>

+ 428 - 0
iamberry-app-service/.svn/pristine/6d/6d71eb3b75e43417b4e613f95997d50005b5b3e6.svn-base

@@ -0,0 +1,428 @@
+package com.iamberry.app.service;
+
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.dto.RemoteIpInfoDTO;
+import com.iamberry.app.core.dto.UserDTO;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.tool.util.AES;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.MD5;
+import com.iamberry.app.tool.util.TuyaConnector;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+/**
+ * UserService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:29
+ */
+@Service
+public class UserServiceImpl extends BaseService implements UserService {
+	
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+
+	/**
+	 * register
+	 *
+	 * @author Moon Cheng
+	 * @param phone 电话号码
+	 * @param password 密码
+	 * @param ip ip地址
+	 * @return User Information
+	 */
+	@Transactional
+	public User register(String phone, String password, String ip) {
+		// 创建用户,填充数据
+		User user = new User(phone, MD5.md5(password), new Date(), Constants.USER_SAVE_TEL);
+		user.setUserTel(phone);															// 完善手机号码
+		String defaultName = phone.substring(0, 3) + "****" + phone.substring(7, 11);	// 默认的昵称
+		user.setDisplay_name(defaultName);
+		user.setStatus_(Constants.USER_SAVE_TEL);										// 当前用户的状态为已完善手机号码,待完善宝宝信息
+		user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1")); 		// 设置宝宝生日
+		RemoteIpInfoDTO dto = getLocation(ip);
+		if (dto != null) {
+			try {
+				user.setLocation(dto.getCity());
+			} catch (Exception e) {
+				user.setLocation("深圳");
+			}
+		}
+		
+		// 在此,生成用户的保存区间,保证系统调用成功,通过手机号hash 定位当前区间
+//		int interval = phone.hashCode() % 10;
+		
+		user.setCreated_on(new Date());													// 创建时间为当前时间
+		userMapper.insertUser(user);
+		
+		if (user.getId() == null) {
+			return null;
+		}
+
+		// 生成token
+		String token = getEncToken(user.getId());
+		user.setToken(token);
+		user.setPassword(null);
+		
+		// 返回数据
+		return user;
+	}
+
+	/**
+	 * thirdPartBindingPhone
+	 * @param phone
+	 * @param openId
+	 * @return
+	 */
+	public User thirdPartBindingPhone(String phone, String openId) {
+		// 判断用户是否存在
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			return null;
+		}
+		// 用户已经完善手机号码,不需要完善
+		if (!user.getStatus_().equals(Constants.USER_NOW_INIT)) {
+			return null;
+		}
+		
+		// 根据手机号码,完善信息
+		User db = new User();
+		db.setUserTel(phone);
+		db.setStatus_(Constants.USER_SAVE_TEL);
+		db.setId(user.getId());
+		
+		// 判断手机号码是否存在账户信息,如果有,需要copy
+		User tempUser = userMapper.getOtherUserByTel(phone, user.getId().intValue());
+		if (tempUser != null) {
+			// 需要copy信息
+			db.setBaby_dob(tempUser.getBaby_dob());
+			db.setBaby_gender(tempUser.getBaby_gender());
+			db.setBaby_nickname(tempUser.getBaby_nickname());
+			db.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 执行修改
+		int status = userMapper.updateUser(db);
+		if (status > 0) {
+			user.setUsername(phone);
+			user.setPassword(null);
+		} else {
+			return null;
+		}
+		
+		user.setStatus_(db.getStatus_());
+		return user;
+	}
+
+	/**
+	 * findById
+	 * @param id
+	 * @return User
+	 */
+	public User findById(Long id) {
+		User user = userMapper.selectUserById(id);
+		user.setPassword(null);
+		return user;
+	}
+
+	/**
+	 * login
+	 *
+	 * @param phone
+	 * @param password
+	 * @param userAgent
+	 * @return
+	 */
+	public Object login(String phone, String password) {
+		User user = userMapper.selectUserByUsername(phone);
+		if (user == null) {
+			return -1;
+		}
+		if (!MD5.md5(password).equals(user.getPassword())) {
+			return -2;
+		}
+		if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 待完善宝宝信息
+			user.setIs_perfect_user(2);
+		}
+		// 生成token
+		String token = getEncToken(user.getId());
+		// 将手机号码 -----> username
+		user.setUsername(user.getUserTel());
+		user.setToken(token);
+		user.setPassword(null);
+		// 注册涂鸦
+		UserDTO dto = tuyaConnect(user);
+		if (Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			dto.setIs_perfect_user(1);
+		} else if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 需要完善宝宝信息
+			dto.setIs_perfect_user(2);
+		} else {
+			// 注册完成
+			dto.setIs_perfect_user(3);
+		}
+		return dto;
+	}
+
+	/**
+	 * thirdPartLogin
+	 *
+	 * @param openId
+	 * @param extType
+	 * @param extName
+	 * @param extPicture
+	 * @return
+	 */
+	public User thirdPartLogin(String openId, String extType, String extName, String extPicture, String ip) {
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			// 不存在,则自动注册,如果是第三方登录的用户,默认为刚初始化,需要完善手机号码、宝宝信息,账户才能正常使用
+			user = new User(openId, MD5.md5(Constants.TUYA_DEFAULT_PASS), new Date(), Constants.USER_NOW_INIT);
+			user.setExt_open_id(openId);
+			user.setExt_type(extType);
+			user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1"));
+			user.setDisplay_name(extName.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"));
+			user.setUserTel("");	// 手机号码默认为空
+
+			RemoteIpInfoDTO dto = getLocation(ip);
+			if (dto != null) {
+				user.setLocation(dto.getCity());
+			} else {
+				user.setLocation("默认");
+			}
+
+			user.setDisplay_picture(extPicture);
+			userMapper.insertUser(user);
+		}
+		// 获取token
+		user.setToken(WebJsonTokenUtil.getToken(user.getId().intValue()));
+		user.setPassword(null);
+		if (!Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			user.setUsername(user.getUserTel());
+		}
+		
+		return user;
+	}
+
+	/**
+	 * updateUserInfo
+	 *
+	 * @param user
+	 * @param token
+	 * @return
+	 */
+	public User updateUserInfo(User user, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		/*if (!userInfo.getStatus_().equals(Constants.USER_SAVE_TEL)) {
+			return null;
+		}*/
+		
+		/**
+		 * 修改宝宝信息,只需要修改三个字段,宝宝昵称、宝宝性别、宝宝生日,其中默认 修改状态
+		 */
+		if (user.getBaby_dob() != null) {
+			user.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 清楚token,防止修改
+		user.setToken(null);
+		// 修改
+		user.setId(userInfo.getId());
+		userMapper.updateUser(user);
+		
+		// 更新用户信息,并且返回
+		userInfo.setPassword(null);
+		userInfo.setBaby_dob(user.getBaby_dob());
+		userInfo.setBaby_nickname(user.getBaby_nickname());
+		userInfo.setBaby_gender(user.getBaby_gender());
+		userInfo.setStatus_(Constants.USER_ACTIVE);
+		userInfo.setToken(token);
+		if(StringUtils.isNotEmpty(user.getDisplay_name())){
+			userInfo.setDisplay_name(user.getDisplay_name());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * updateDisplayPicture
+	 *
+	 * @author Moon Cheng
+	 * @param base64
+	 * @param token
+	 * @return
+	 */
+	public String updateDisplayPicture(String imageURL, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		/*if (userMapper.updateUserAvator(userInfo.getId(), base64) < 1) {
+			userMapper.insertUserAvator(userInfo.getId(), base64);
+		}*/
+	
+
+		// final String BASE_URL = "http://localhost/imberry-api";
+		int status = userMapper.updateDisplayPicture(imageURL, userInfo.getId());
+		if (status < 1) {
+			return "ERROR";
+		}
+		return imageURL;
+	}
+
+	/**
+	 * changePhone
+	 *
+	 * @author Moon Cheng
+	 * @param phone
+	 * @param token
+	 * @return
+	 */
+	public User changePhone(String phone, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		//  修改绑定的手机号码
+		User user = new User();
+		user.setId(userInfo.getId());
+		user.setUserTel(phone);
+
+		userMapper.updateUser(user);
+		userInfo = userMapper.selectUserById(userInfo.getId());
+		userInfo.setPassword(null);
+		return userInfo;
+	}
+
+	/**
+	 * resetPassWord
+	 *
+	 * @param oldPassword
+	 * @param newPassword
+	 * @param token
+	 * @return
+	 */
+	public int changePassword(String oldPassword, String newPassword, String token) {
+		int status = -1;
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+
+		User user = userMapper.validateUser(userInfo.getUsername(), MD5.md5(oldPassword));
+		if (user == null) {
+			return 0;
+		}
+		
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	/**
+	 * changePassWord
+	 *
+	 * @param username,
+	 *            newPassword
+	 * @param session
+	 * @return int
+	 */
+	public int resetPassWord(String username, String newPassword) {
+		int status = 0;
+		User user = userMapper.selectUserByUsername(username);
+		if (user == null) {
+			return -3;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	public UserDTO tuyaConnect(User user) {
+		UserDTO userInfo = new UserDTO(user.getId(), user.getUsername(), user.getPassword(), user.getToken(), user.getDisplay_name(),
+				user.getDisplay_picture(), user.getCreated_on(), user.getExt_open_id(), user.getExt_name(), user.getExt_type(),
+				user.getLocation(), user.getBaby_nickname(), user.getBaby_dob(), user.getBaby_gender(), user.getStatus_());
+		userInfo.setPassword(null);
+		try {
+			userInfo.setEncryptUsername(AES.encrypt(user.getUsername()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		userInfo.setUserCode(Constants.TUYA_DEFAULT_PASS);
+		// Tuya connection
+		TuyaConnector.TuyaSyncConnect(userInfo.getEncryptUsername(), userInfo.getUserCode());
+		return userInfo;
+	}
+
+	/**
+	 * getStartPage
+	 *
+	 * @return String
+	 */
+	public String getStartPage() {
+		return userMapper.selectConfig("start_page");
+	}
+
+	/**
+	 * getLocation
+	 *
+	 * @param ip
+	 * @return String
+	 */
+	public RemoteIpInfoDTO getLocation(String ip) {
+		RemoteIpInfoDTO remoteIpInfoDTO = new RemoteIpInfoDTO();
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+		try {
+			String result = HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL, ip));
+			remoteIpInfoDTO = mapper.readValue(result, RemoteIpInfoDTO.class);
+		} catch (Exception e) {
+		}
+		return remoteIpInfoDTO;
+	}
+
+	/**
+	 * getApkVersion
+	 *
+	 * @return
+	 */
+	public String getApkVersion(){
+		return userMapper.selectConfig("apk_version");
+	}
+
+	@Override
+	public String selectUserAvator(Long id) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserAvator(id);
+	}
+
+	@Override
+	public User selectUserByUsername(String username) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserByUsername(username);
+	}
+
+	@Override
+	public List<User> getAll(int start, int end) {
+		return null;
+	}
+
+}

+ 8 - 0
iamberry-app-service/.svn/pristine/6e/6e9149fa6f1e99bd69d036491ba5018096d42ed0.svn-base

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="iamberry-app-service">
+        <wb-resource deploy-path="/" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
+        <wb-resource deploy-path="/" source-path="/src/test/java"/>
+        <wb-resource deploy-path="/" source-path="/src/test/resources"/>
+    </wb-module>
+</project-modules>

+ 109 - 0
iamberry-app-service/.svn/pristine/74/7410d70b8102f6c7047b091b2bc149029cdde9f5.svn-base

@@ -0,0 +1,109 @@
+package com.iamberry.app.start;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.support.AbstractApplicationContext;
+
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.ulitity.Utility;
+
+@ImportResource("classpath:iamberry-app-service-spring.xml")
+@SpringBootApplication
+public class InitApp {
+    @Bean
+    public CountDownLatch closeLatch() {
+        return new CountDownLatch(1);
+    }
+	public static void main(String[] args) throws Exception {
+		AbstractApplicationContext ctx = (AbstractApplicationContext) new SpringApplicationBuilder().sources(InitApp.class).web(false).run(args);
+		CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
+		/*
+		// 获取
+		UserService milkService = ctx.getBean(UserService.class);
+		UserMapper userMapper = ctx.getBean(UserMapper.class);
+		int pageNO = 0;
+		boolean flag = true;
+		while (flag) {
+			// 查询第一页的数据,直接页数
+			int start = pageNO * 100;
+			int end = 100;
+			// 下一次查询
+			pageNO++;
+
+			// 获取一页的数据
+			List<User> users = milkService.getAll(start, end);
+			for (User user : users) {
+				// 判断用户是第三方登录,还是自己注册的
+				if (StringUtils.isEmpty(user.getExt_type())) {
+					// 使用手机号码注册
+					if (StringUtils.isNotEmpty(user.getUserTel())) {
+					} else {
+
+						// 判断是否拥有宝宝信息,如果拥有宝宝信息,那么账户正常,否则需要完善宝宝信息
+						user.setStatus_("SAVE_TEL");
+						
+						if (user.getBaby_nickname() != null) {
+							user.setStatus_("active");
+						} else {
+							if (user.getBaby_dob() != null && user.getBaby_dob().getTime() > 0) {
+								System.out.println("数据一致" + Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1").getTime() + "=" + user.getBaby_gender());
+								user.setStatus_("active");
+							}
+						}
+						
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setUserTel(user.getUsername());
+						temp.setStatus_(user.getStatus_());
+						userMapper.updateUser(temp);
+						System.out.println("修改自己注册的用户:" + user);
+					}
+				} else {
+					// 第三方注册
+					
+					// username是否是手机号码,如果是手机号码,那么把保存到user_tel,并且状态更新为SAVE_TEL,否则NOW_INIT
+					if (user.getUsername().length() == 11) {
+						user.setUserTel(user.getUsername());
+						user.setStatus_("SAVE_TEL");
+						// 宝宝信息是否存在,如果存在,那么状态为active,否则为
+						if (user.getBaby_nickname() != null) {
+							user.setStatus_("active");
+						} else {
+							if (user.getBaby_dob() != null && user.getBaby_dob().getTime() > 0) {
+								System.out.println("数据一致" + Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1").getTime() + "=" + user.getBaby_gender());
+								user.setStatus_("active");
+							}
+						}
+						
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setUserTel(user.getUserTel());
+						temp.setStatus_(user.getStatus_());
+						temp.setUsername(user.getExt_open_id());
+						userMapper.updateUser(temp);
+					} else {
+						user.setStatus_("NOW_INIT");
+						User temp = new User();
+						temp.setId(user.getId());
+						temp.setStatus_(user.getStatus_());
+						temp.setUsername(user.getExt_open_id());
+						userMapper.updateUser(temp);
+					}
+					System.out.println("修改第三方注册的用户:" + user);
+				}
+			}
+			if (users.size() < 100) {
+				// 停止
+				flag = false;
+			}
+		}*/
+		closeLatch.await();
+	}
+}

+ 315 - 0
iamberry-app-service/.svn/pristine/75/75402f7c9e9376c094b8b466c774888400f97887.svn-base

@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MilkMapper">
+
+	<sql id="milkAttribute">
+		id,
+		volume,
+		controller,
+		stars,
+		comments,
+		brand,
+		powder_info,
+		machine_name,
+		machine,
+		user,
+		timestamp_
+	</sql>
+	
+	<sql id="powderAttribute">
+		id,
+		powder_number,
+		spoon_picture,
+		bar_code,
+		brand,
+		series,
+		level,
+		version_,
+		age_range,
+		weight_per_spoon,
+		milk_volume_per_spoon,
+		powder_ratio,
+		density,
+		type,
+		status_,
+		created_on
+	</sql>
+	
+	<resultMap type="MilkMakingRecord" id="milkMap">
+		<id property="id" column="id"/>
+		<result property="volume" column="volume"/>
+		<result property="controller" column="controller"/>
+		<result property="stars" column="stars"/>
+		<result property="comments" column="comments"/>
+		<result property="brand" column="brand"/>
+		<result property="powder_info" column="powder_info"/>
+		<result property="machine_name" column="machine_name"/>
+		<result property="machine" column="machine"/>
+		<result property="user" column="user"/>
+		<result property="timestamp_" column="timestamp_"/>
+	</resultMap>
+	
+	<resultMap type="MilkPowderInfo" id="powderMap">
+		<id property="id" column="id"/>
+		<result property="powder_number" column="powder_number"/>
+		<result property="spoon_picture" column="spoon_picture"/>
+		<result property="bar_code" column="bar_code"/>
+		<result property="brand" column="brand"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="version_" column="version_"/>
+		<result property="age_range" column="age_range"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+		<result property="milk_volume_per_spoon" column="milk_volume_per_spoon"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="density" column="density"/>
+		<result property="type" column="type"/>
+		<result property="status_" column="status_"/>
+		<result property="created_on" column="created_on"/>
+	</resultMap>
+	
+	<resultMap type="com.iamberry.app.core.dto.MilkInfoDTO" id="milkInfoDtoMap">
+		<id property="id" column="id"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="type" column="type"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+	</resultMap>
+	
+	<!-- 添加信息到milk_making_record表中 -->
+	<insert id="insertMilkMakingRecord" parameterType="MilkMakingRecord" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_MAKING_RECORD
+		(VOLUME,CONTROLLER,STARS,COMMENTS,BRAND,POWDER_INFO,MACHINE_NAME,MACHINE,USER,TIMESTAMP_) 
+		VALUES
+		(#{volume},#{controller},#{stars},#{comments},#{brand},#{powder_info},#{machine_name},#{machine},#{user},NOW())
+	</insert>
+	
+	<!-- 根据id修改MILK_MAKING_RECORD的start和comments属性 -->
+	<update id="updateMilkMakingRecord">
+		UPDATE MILK_MAKING_RECORD SET STARS = #{0}, COMMENTS = #{1} WHERE ID = #{2}
+	</update>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			user = #{5} 
+		AND 
+			machine = #{6} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMachineMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			machine = #{5} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 根据id查询MILK_MAKING_RECORD所有信息 -->
+	<select id="selectMilkMakingRecord" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据user查询所有冲奶信息 -->
+	<select id="getMilkPowderByUser" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE USER = #{0}
+	</select>
+	
+	<!-- 根据user查询总冲奶量和次数 -->
+	<select id="getMilkPowderSumByUser" parameterType="java.lang.Long" resultType="com.iamberry.app.core.dto.RecordCountInfoDTO">
+		SELECT COUNT(1) count,SUM(VOLUME) total FROM MILK_MAKING_RECORD WHERE USER = #{0} 
+	</select>
+	
+	<!-- 将奶粉信息插入到奶粉信息表中 -->
+	<insert id="insertMilkPowderInfo" parameterType="MilkPowderInfo" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_POWDER_INFO
+			(POWDER_NUMBER,SPOON_PICTURE,BAR_CODE,BRAND,SERIES,LEVEL,VERSION_,AGE_RANGE,
+			WEIGHT_PER_SPOON,MILK_VOLUME_PER_SPOON,POWDER_RATIO,DENSITY,TYPE,STATUS_,CREATED_ON) 
+		VALUES
+			(#{powder_number},#{spoon_picture},#{bar_code},#{brand},#{series},#{level},#{version_},#{age_range},#{weight_per_spoon},
+			#{milk_volume_per_spoon},#{powder_ratio},#{density},#{type},#{status_},NOW())
+	</insert>
+	
+	<!-- 通过条形码查询奶粉信息 -->
+	<select id="selectMilkPowderInfo" parameterType="java.lang.String" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BAR_CODE = #{0}  and status_='approved' 
+	</select>
+	
+	<!-- 根据品牌查询奶粉信息的系列 -->
+	<select id="selectSeries" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT 
+			series 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{brand} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息的段数 -->
+	<select id="selectLevel" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT level FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC 
+	</select>
+	
+	<!-- 根据奶粉品牌获取奶粉,详细信息 -->
+	<select id="selectMilkInfoBybrand" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			series,
+			level,
+			type,
+			id,
+			powder_ratio,
+			weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{0} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息 -->
+	<select id="selectMilkInfo" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			level,type,id,powder_ratio,weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			SERIES LIKE #{0} 
+		ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉类型 -->
+	<select id="selectMilkType" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT type FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据奶粉系列查询奶粉密度 -->
+	<select id="selectMilkDensity" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT density FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉比例 -->
+	<select id="selectMilkRatio" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT powder_ratio FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉id -->
+	<select id="selectMilkId" parameterType="java.lang.String" resultType="java.lang.Long">
+		SELECT id FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉的重量 -->
+	<select id="selectMilkWeightPerSpoon" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT weight_per_spoon FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 查询奶粉品牌 -->
+	<select id="selectMilkPowderBrand" resultType="java.lang.String">
+		SELECT brand FROM MILK_POWDER_INFO WHERE STATUS_ = 'approved' GROUP BY BRAND
+	</select>
+	
+	<!-- 根据系列段数品牌获取奶粉信息 -->
+	<select id="selectMilkInfoByBrandSeriesLevel" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BRAND = #{0} AND SERIES = #{1} AND LEVEL = #{2} 
+	</select>
+	
+	<!-- 查询冲奶记录的冲奶时间 -->
+	<select id="selectLastRecordDate" resultType="java.util.Date">
+		SELECT timestamp_ FROM MILK_MAKING_RECORD WHERE CONTROLLER = 'machine' ORDER BY ID DESC LIMIT 1 
+	</select>
+	
+	<!-- 根据用户id查询冲奶机机器码 -->
+	<select id="getMyMachines" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT machine_mac FROM MACHINE WHERE OWNER = #{0}
+	</select>
+	
+	<!-- 将信息插入到冲奶记录表中 -->
+	<insert id="insertRecordData" parameterType="MilkMakingRecord">
+		INSERT INTO milk_making_record (volume, controller, machine, timestamp_, user) VALUE (#{volume}, 'machine', #{machine}, #{timestamp_}, #{user})
+	</insert>
+	
+	<!-- milk_images表中添加数据 -->
+	<insert id="insertMilkImages" parameterType="MilkImages" useGeneratedKeys="true" keyProperty="image_id">
+		INSERT INTO MILK_IMAGES
+		(
+			IMAGE_MILK_ID,IMAGE_FRONT,IMAGE_BAR,IMAGE_FEED
+		) 
+		VALUES 
+		(
+			#{image_Milk_ID},#{image_Front},#{image_Bar},#{image_Feed}
+		)
+	</insert>
+	
+	<!-- 获取某一天的冲奶记录 -->
+	<select id="getMilkRecordByTime" parameterType="java.util.Map" resultType="com.iamberry.app.core.entity.MilkDatetimeValue">
+		<![CDATA[
+		SELECT
+			VOLUME value,
+			DATE_FORMAT(TIMESTAMP_, '%T') dateTime
+		FROM
+			MILK_MAKING_RECORD
+		WHERE
+			MACHINE = #{mac}
+		AND TIMESTAMP_ >= #{start}
+		AND TIMESTAMP_ <= #{end}
+		]]>
+	</select>
+	
+	
+	<!-- 获取某一月/年的冲奶记录 -->
+	<select id="getMilkRecordByDate" parameterType="java.util.Map" resultType="com.iamberry.app.core.entity.MilkDatetimeValue">
+		SELECT
+			SUM(VOLUME) value,
+		<choose>
+			<when test="year == true">
+				DATE_FORMAT(TIMESTAMP_, '%Y-%m') dateTime
+			</when>
+			<otherwise>
+				DATE_FORMAT(TIMESTAMP_, '%Y-%m-%d') dateTime
+			</otherwise>
+		</choose>
+		FROM
+			MILK_MAKING_RECORD
+		WHERE
+			MACHINE = #{mac}
+		AND TIMESTAMP_ >= #{start}
+		<![CDATA[
+		AND TIMESTAMP_ <= #{end}
+		]]>
+		GROUP BY
+			dateTime
+	</select>
+</mapper>

+ 466 - 0
iamberry-app-service/.svn/pristine/79/79077725222d514c884786a7d77c9bbc0c892290.svn-base

@@ -0,0 +1,466 @@
+package com.iamberry.app.service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.math.NumberUtils;
+import org.joda.time.DateTime;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.dto.RecordDTO;
+import com.iamberry.app.core.entity.MilkDatetimeValue;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.MilkService;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.DateTimeUtil;
+
+/**
+ * MilkService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:10
+ */
+@Service
+public class MilkServiceImpl extends BaseService implements MilkService {
+
+	/**
+	 * setMilkMakingRecord
+	 * @param makingRecord
+	 * @param token
+	 * @param recordId
+	 * @return
+	 */
+	public MilkMakingRecord setMilkMakingRecord(MilkMakingRecord makingRecord, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		makingRecord.setUser(userInfo.getId());
+		makingRecord.setTimestamp_(new Date());
+		milkMapper.insertMilkMakingRecord(makingRecord);
+		return makingRecord;
+	}
+
+	/**
+	 * searchUserRecordsBytime
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @param startTime
+	 * @param endTime
+	 * @return Milk Making Record List
+	 */
+	public Map<String, List<RecordDTO>> searchUserRecordsByTime(Long userId, String dateStatus, String chosenDate,
+			String machineMac) {
+
+		Map<String, List<RecordDTO>> recordInfos = new LinkedHashMap<String, List<RecordDTO>>();
+		String dateType = null, formatter = null;
+		Calendar calendar = Calendar.getInstance();
+		if (chosenDate != null) {
+			// calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd
+			// HH:mm:ss", chosenDate));
+			// 防止无数据时显示分钟错误
+			chosenDate = chosenDate.substring(0, chosenDate.length() - 6) + ":00:00";
+			calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+		} else {
+			calendar.setTime(new Date());
+		}
+		Date start = null, end = null;
+		switch (dateStatus) {
+		case "day":
+			dateType = "days";
+			formatter = "%Y%m%d%H";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "week":
+			dateType = "weeks";
+			formatter = "%Y%m%d";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			if (Calendar.SUNDAY < Calendar.MONDAY) {
+				calendar.add(Calendar.DATE, 7);
+			}
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "year":
+			dateType = "years";
+			formatter = "%Y%m";
+			calendar.set(calendar.get(Calendar.YEAR), 0, 1, 0, 0, 0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), 11, 31, 23, 59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		}
+		return Utility.fillAppMachineRecordWithZero(Utility.synAppMachineRecord(recordInfos), dateType, chosenDate);
+	}
+
+	/**
+	 * searchUserRecordById
+	 *
+	 * @author Moon Cheng
+	 * @param recordId
+	 * @return Milk Making Record Information
+	 */
+	public MilkMakingRecord searchUserRecordById(Long recordId) {
+		MilkMakingRecord makingRecord = milkMapper.selectMilkMakingRecord(recordId);
+		return makingRecord;
+	}
+
+	/**
+	 * 根据用户,获取冲奶记录的-->总量和次数
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @return
+	 */
+	public RecordCountInfoDTO getTotalMilkVolumeMadeByUser(Long userId) {
+		RecordCountInfoDTO recordcount = milkMapper.getMilkPowderSumByUser(userId);
+		return  recordcount;
+	}
+
+	/**
+	 * setMilkPowderInfo
+	 *
+	 * @author Moon Cheng
+	 * @param entity
+	 * @param token
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo setMilkPowderInfo(MilkPowderInfo entity, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		// change status as user's phone number
+		entity.setStatus_(
+				userInfo.getUsername().length() > 11 ? Constants.MILK_POWDER_NOT_APPROVED : userInfo.getUsername());
+		entity.setCreated_on(new Date());
+		milkMapper.insertMilkPowderInfo(entity);
+		return entity;
+	}
+
+	/**
+	 * searchMilkPowderInfoByBarCode
+	 *
+	 * @author Moon Cheng
+	 * @param barcode
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo searchMilkPowderInfoByBarCode(String barcode) {
+		MilkPowderInfo milkPowderInfo = milkMapper.selectMilkPowderInfo(barcode);
+		return milkPowderInfo;
+	}
+
+	/**
+	 * 
+	 * 通过品牌名获取奶粉信息
+	 * @author Moon Cheng, Yin
+	 * @param brand
+	 * @return Milk Powder List
+	 */
+	public Map<String, List<String>> searchMilkPowderInfosByBrand(String brand) {
+		brand = "%" + brand.trim() + "%";
+		Map<String, List<String>> infos = new IdentityHashMap<String, List<String>>();
+		List<MilkInfoDTO> milkInfo = milkMapper.selectMilkInfoBybrand(brand);
+		for (int i = 0; i < milkInfo.size(); i++) {
+			List<String> list = new LinkedList<String>();
+			list.add(milkInfo.get(i).getLevel() + ":" + milkInfo.get(i).getType() + ":"
+					+ milkInfo.get(i).getPowder_ratio() + ":" + milkInfo.get(i).getId() + ":"
+					+ milkInfo.get(i).getWeight_per_spoon());
+			infos.put(milkInfo.get(i).getSeries(),list);
+		}
+		
+		return infos;
+	}
+
+	/**
+	 * searchMilkPowderBrand
+	 *
+	 * @return Brand List
+	 */
+	public List<String> searchMilkPowderBrand() {
+		List<String> milkPowderInfos = milkMapper.selectMilkPowderBrand();
+		List<String> result = new ArrayList<>();
+		milkPowderInfos.forEach(milk -> {
+			if (NumberUtils.isNumber(milk) && milk.contains(".")) {
+				milk = milk.substring(0, milk.indexOf("."));
+			}
+			result.add(milk);
+		});
+		return result;
+	}
+
+	/**
+	 * searchMilkInfoByBrandSeriesLevel
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo searchMilkInfoByBrandSeriesLevel(String brand, String series, String level) {
+		return milkMapper.selectMilkInfoByBrandSeriesLevel(brand, series, level);
+	}
+
+	// =====================================TuyaHistoryData======================================
+	/**
+	 * getLastRecordDate
+	 *
+	 * @return
+	 */
+	public Date getLastRecordDate() {
+		Date lastDate = milkMapper.selectLastRecordDate();
+		return lastDate == null ? new Date() : lastDate;
+	}
+
+	/**
+	 * addRecordData
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void addRecordData(String devId, String value, Long time, Long userId) {
+		MilkMakingRecord milkMakingRecord = new MilkMakingRecord();
+		milkMakingRecord.setVolume(Integer.parseInt(value));
+		milkMakingRecord.setMachine(devId);
+		milkMakingRecord.setTimestamp_(new Date(time));
+		milkMakingRecord.setUser(userId);
+		milkMapper.insertRecordData(milkMakingRecord);
+	}
+
+	@Override
+	public void setMilkImages(MilkImages images) {
+		// TODO Auto-generated method stub
+		milkMapper.insertMilkImages(images);
+	}
+
+	@Override
+	public List<MilkDatetimeValue> getMilkRecordByTime(String mac, String date) {
+		// TODO Auto-generated method stub
+		
+		// 处理搜索的时间
+		date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM-dd"));
+		
+		// 获取时间区间
+		Date startDate = DateTimeUtil.parse(date, "yyyy-MM-dd");
+		
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(startDate);
+		calendar.set(Calendar.HOUR_OF_DAY, 24);
+		
+		// 获取
+		List<MilkDatetimeValue> list = milkMapper.getMilkRecordByTime(mac, startDate, calendar.getTime());
+		return list;
+	}
+
+	@Override
+	public List<MilkDatetimeValue> getMilkRecordByDate(String mac, String date) {
+		
+		// 处理搜索的时间
+		date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM"));
+		
+		// 判断统计单位:年份或者是月
+		boolean isYear = false;
+		if (date.indexOf("-") == -1) {
+			isYear = true;
+		}
+		
+		// year =  true 表示统计年份,false : 表示统计月
+		final boolean year = isYear;
+		
+		// 返回的数据格式
+		String dateFormat = year ? "yyyy-MM" : "yyyy-MM-dd";
+		
+		// 获取时间区间
+		Date startDate = year ? DateTimeUtil.parse(date, "yyyy") : DateTimeUtil.parse(date, "yyyy-MM");
+		Date endDate = getLastDayOfYear(startDate, year);
+		
+		// 查询数据
+		List<MilkDatetimeValue> values = milkMapper.getMilkRecordByDate(year, mac, startDate, endDate);
+		
+		// 如果为空需要填充数据到8条
+		if (values == null || values.size() <= 0) {
+			values = new ArrayList<MilkDatetimeValue>();
+			Date tempDate = startDate;
+			for (int i = 0; i < 8; i++) {
+				values.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
+				tempDate = getDate(tempDate, year);
+			}
+			return values;
+		}
+		
+		// 创建返回对象
+		List<MilkDatetimeValue> returnValues = new ArrayList<MilkDatetimeValue>(year ? 12 : 31);
+		
+		// 当前已经填充的时间
+		Date paddDate = null;
+		
+		for (int i = 0; i < values.size(); i++) {
+			
+			// 获取当前迭代的数据,如果为空,那么跳过
+			MilkDatetimeValue milkDatetimeValue = values.get(i);
+			if (milkDatetimeValue == null || milkDatetimeValue.getDateTime() == null) {
+				continue;
+			}
+			
+			// 获取当前时间
+			Date temp = DateTimeUtil.parse(milkDatetimeValue.getDateTime(), dateFormat);
+			
+			// 填充
+			paddDate = padding(temp, returnValues, year, paddDate, milkDatetimeValue);
+		}
+		
+		// 保证返回数据为8条,可能还需要填充
+		if (returnValues.size() <= 8) {
+			int count = 8 - returnValues.size();
+			Date tempDate = DateTimeUtil.parse(returnValues.get(returnValues.size() - 1).getDateTime(), dateFormat);
+			for (int i = 0; i < count; i++) {
+				tempDate = getAddDate(tempDate, year);
+				returnValues.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
+			}
+		}
+		
+		// 返回
+		return returnValues;
+	}
+	
+	/**
+	 * 填充数据方法
+	 * @param dateYear
+	 * @param values
+	 * @param isYear
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public static Date padding(Date dateYear, List<MilkDatetimeValue> values, final boolean isYear, Date paddDate, MilkDatetimeValue milkDatetimeValue) {
+		
+		// 填充的原则是,如果已经填充过的时间为空,表示可以填充;
+		// 如果需要填充的时间大于已经填充的时间,表示可以填充
+		if (paddDate == null || dateYear.getTime() > paddDate.getTime()) {
+			// next
+			Date nextDate = getUpDate(dateYear, isYear);
+			if (nextDate != null) {
+				padding(nextDate, values, isYear, paddDate, null);
+			}
+			
+			// add Data
+			MilkDatetimeValue datetimeValue = new MilkDatetimeValue();
+			datetimeValue.setDateTime(DateTimeUtil.format(dateYear, isYear ? "yyyy-MM" : "yyyy-MM-dd"));
+			datetimeValue.setValue(milkDatetimeValue == null ? 0 : milkDatetimeValue.getValue());
+			values.add(datetimeValue);
+			
+			// 替换已经填充过的时间
+			paddDate = dateYear;
+		}
+		return paddDate;
+	}
+	
+	/**
+	 * 根据当前时间,获取上一个记录的时间
+	 * @param date
+	 * @param isYear
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public static Date getUpDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	// 如果当前月份为1月,那么,不需要处理啦,应该跳过
+        	if (cal.get(Calendar.MONTH) == 0) {
+        		return null;
+        	}
+        	cal.add(Calendar.MONTH, -1);
+        } else {
+        	// 如果当前天为1日,那么,不需要处理啦,应该跳过
+        	if (cal.get(Calendar.DAY_OF_MONTH) <= 1) {
+        		return null;
+        	}
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+        }
+		return cal.getTime();
+	}
+	
+	public static Date getDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	cal.add(Calendar.MONTH, -1);
+        } else {
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+        }
+		return cal.getTime();
+	}
+	
+	public static Date getAddDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	cal.add(Calendar.MONTH, +1);
+        } else {
+            cal.add(Calendar.DAY_OF_MONTH, +1);
+        }
+		return cal.getTime();
+	}
+
+	/**
+	 * 根据一个数据获取对应的结束时间,如果是年,获取本年最后一个月的最后一天
+	 * @param date
+	 * @param year
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+    public static Date getLastDayOfYear(Date date, boolean year) {
+    	Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, 24);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        if (year) {
+        	cal.set(Calendar.MONTH, cal.getActualMaximum(Calendar.MONTH));
+        }
+        return cal.getTime();
+    }
+}

+ 332 - 0
iamberry-app-service/.svn/pristine/82/8279a59ecd0413d2345ab461fd4e1ae624e05b19.svn-base

@@ -0,0 +1,332 @@
+package com.iamberry.app.service;
+
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_KEY;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Response;
+import com.iamberry.app.config.ResponseHeader;
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.face.CodeService;
+import com.iamberry.app.mapper.CodeMapper;
+import com.iamberry.app.tool.util.Result;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.ResponseJson;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码业务实现类
+ */
+@Service
+public class CodeServiceImpl implements CodeService {
+
+	@Autowired
+	private CodeMapper codeMapper;
+	
+	private static Logger log = LoggerFactory.getLogger(CodeServiceImpl.class);
+	private static String ENCODING = "UTF-8";
+
+	@Override
+	public ResponseJson sendCode(String phone, int codeScenario) {
+		// TODO Auto-generated method stub
+		// 第一步,判断使用通道,如果是+86开头,优先使用国内通道,否则默认使用国外通道
+		ResponseJson json = new ResponseJson();
+		if (StringUtils.isEmpty(phone)) {
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Phone Empty!");
+			return json;
+		}
+		
+		// 第二步,如果是国内,判断是否存在
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		 
+		// 通道是否是中国的
+		boolean IS_CHANNEL_ZH = true;
+		if (StringUtils.indexOf(phone, "+") != -1) {
+			if (StringUtils.startsWith(phone, "+86")) {
+				IS_CHANNEL_ZH = true;
+			}
+		} else {
+			IS_CHANNEL_ZH = true;
+		}
+		// 判断通道
+		if (IS_CHANNEL_ZH && codeValid != null) {
+			// ** 切换通道需求:每次请求验证码,如果上一次验证码在一分钟以后,三分钟以内没有使用,那么切换通道 **//
+			if (now.getTime() <= (codeValid.getCodeValidDate().getTime()) && 
+					(now.getTime() - 60000) >= codeValid.getCodeSendDate().getTime() && codeValid.getCodeUse() == 2 && codeValid.getCodeScenario() == codeScenario) {
+				// 如果等待三分钟后,那么切换通道,暂时不切换
+//				IS_CHANNEL_ZH = false;
+			}
+		}
+		// 获取验证码
+		String code = Utility.getRandomCode(4);
+		json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		if (json.getReturnCode() != 200) {
+			json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		}
+		// 保存发送记录
+		codeValid = new CodeValid();
+		codeValid.setCodeChannel(IS_CHANNEL_ZH ? 1 : 2);
+		codeValid.setCodeMsg(json.getReturnMsg().get("returnMsg").toString());
+		codeValid.setCodePhone(phone);
+		codeValid.setCodeScenario(codeScenario);
+		codeValid.setCodeSendDate(now);
+		codeValid.setCodeValidDate(new Date(now.getTime() + 180000));
+		codeValid.setCodeStatus(json.getReturnCode() == 200 ? 3 : 4);
+		codeValid.setCodeUse(2);
+		codeValid.setCodeValue(Integer.parseInt(code));
+		codeMapper.save(codeValid);
+		return json;
+	}
+	
+	/**
+	 * @param phone		手机号码
+	 * @param code		短信验证码
+	 * @param channel	通道 1:主通道;2:备用通道(国外的电话通通使用此)
+	 * @return
+	 */
+	private ResponseJson sendCMS(String phone, String code, int channel) {
+		
+		log.info("【发送短信】 Tel:" + phone + " ------> code(" + code + "), channel:" + channel);
+		
+		// 国内号码
+		ResponseJson json = new ResponseJson();
+		json.setReturnCode(500);
+		String result = null;
+		try {
+			if (channel == 1) {
+				// 使用主通道
+//				result = sendZHCMS(phone, code);
+				result = sendOtherCMS(phone, code);
+			} else {
+				// 使用备用通道
+				result = sendOtherCMS(phone, code);
+			}
+		} catch (Exception e) {
+			result = e.getMessage();
+		}
+		if (StringUtils.equals(result, "SUCCESS")) {
+			json.setReturnCode(200);
+		}
+		json.addResponseKeyValue(result);
+		return json;
+	}
+	
+	private String sendOtherCMS(String phone, String code) {
+		String text = MessageFormat.format(INTER_SMS_TEXT, code);
+		String results = sendSms(text, phone);
+        JSONObject json =  JSONObject.fromObject(results);
+        String resultcod  = json.get("code").toString();
+        if(resultcod.equals("0")){
+        	System.out.println("使用备用通道,发送验证码成功!" + code);
+        	return "SUCCESS";
+        }else{
+        	System.out.println("使用备用通道,发送失败...!" + code);
+        	return results;
+        }
+		
+	}
+
+	public static String sendSms(String text, String mobile)  {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", INTER_SMS_KEY);
+        params.put("text", text);
+        params.put("mobile", mobile);
+        return post(INTER_SMS_URL, params);
+    }
+
+	 /** 基于HttpClient 4.3的通用POST方法
+    * @param url       提交的URL
+    * @param paramsMap 提交<参数,值>Map
+    * @return 提交响应
+    */
+    public static String post(String url, Map<String, String> paramsMap) {
+    	
+        CloseableHttpClient client = HttpClients.createDefault();
+        String responseText = "";
+        CloseableHttpResponse response = null;
+            try {
+                HttpPost method = new HttpPost(url);
+                if (paramsMap != null) {
+                    List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+                    for (Map.Entry<String, String> param : paramsMap.entrySet()) {
+                        NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+                        paramList.add(pair);
+                    }
+                    method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
+                }
+                response = client.execute(method);
+                HttpEntity entity = response.getEntity();
+                if (entity != null) {
+                    responseText = EntityUtils.toString(entity);
+                }
+                
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    response.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            return responseText;
+        }
+
+	private String sendZHCMS(String phone, String code) throws Exception {
+
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phone);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close(); 
+			if (0 == object.getResultcode()) {
+				return "SUCCESS";
+			} else {
+				return object.getResultcode() + ":" + object.getErrordescription();
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public ResponseJson validCode(String phone, String code, int codeScenario) {
+		ResponseJson json = new ResponseJson();
+		// 校验
+		CodeValid codeValid = codeMapper.getLast(phone);
+		if (codeValid == null) {
+			// 操作有误
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Wrong operation, No send record");
+			return json;
+		}
+		Date now = new Date();
+		if (now.getTime() > codeValid.getCodeValidDate().getTime()) {
+			// 验证码无效
+			json.setReturnCode(403);
+			json.addResponseKeyValue("Verification code is invalid");
+			return json;
+		}
+		// 验证码是否使用 1:已经使用;2:未使用
+		if (codeValid.getCodeUse().intValue() == 1) {
+			// 验证码无效
+			json.setReturnCode(402);
+			json.addResponseKeyValue("Verification code has been used");
+			return json;
+		}
+		// 必须 验证码正确,并且场景正确
+		if (!(codeValid.getCodeValue() == (Integer.parseInt(code)) 
+				&& codeScenario == codeValid.getCodeScenario())) {
+			// 验证码错误
+			json.setReturnCode(405);
+			json.addResponseKeyValue("Verification code error");
+			return json;
+		}
+		// 只要校验成功,表示本次验证码已使用
+		codeMapper.update(codeValid.getCodeId());
+		json.setReturnCode(200);
+		json.addResponseKeyValue("SUCCESS");
+		return json;
+	}
+	
+	/**
+	 * 放轰炸原则:
+	 * 	1、每个手机号码,每60秒只能发送1次!
+	 * 	2、每个手机号码,每小时只能发送三次!
+	 *  3、每个手机号码,每天只能发送10次!
+	 * @param phone
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public Response interval(String phone) {
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		
+		// 每个手机号,限制每60秒,只能发送一次
+		if (codeValid != null && (60000 > (now.getTime() - codeValid.getCodeSendDate().getTime()))) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每60秒只能发送1次!", 0));
+		}
+		
+		// 如果上一次的验证码没有使用,那么需要输入验证码
+		if (codeValid != null && codeValid.getCodeUse() == 2) {
+			return new Response(new ResponseHeader(403, "请输入验证码", 0));
+		}
+		
+		// 生成时间规则
+		Date startDate = new Date();
+		startDate.setMinutes(0);
+		startDate.setSeconds(0);
+		Date endDate = new Date();
+		endDate.setMinutes(59);
+		endDate.setSeconds(60);
+		
+		// 每个手机号码,每个小时最多3条
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 3) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每小时只能发送3次!", 0));
+		}
+		
+		// 每个手机号码,每天最多10条
+		endDate.setHours(23);
+		startDate.setHours(0);
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 10) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每天只能发送10次!", 0));
+		}
+		return new Response(new ResponseHeader(200, "SUCCESS", 0));
+	}
+	
+}

+ 206 - 0
iamberry-app-service/.svn/pristine/86/8651bfedb99c3f870e7b51d11101bfc166a0eafb.svn-base

@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.UserMapper">
+
+	<sql id="userAttribute">
+		id,
+		username,
+		password,
+		token,
+		display_name,
+		display_picture,
+		created_on,
+		ext_open_id,
+		ext_name,
+		ext_type,
+		location,
+		baby_nickname,
+		baby_dob,
+		baby_gender,
+		status_ ,
+		user_tel userTel
+	</sql>
+	
+	<resultMap type="User" id="userMap">
+		<id property="id" column="id"/>
+		<result property="username" column="username"/>
+		<result property="password" column="password"/>
+		<result property="token" column="token"/>
+		<result property="display_name" column="display_name"/>
+		<result property="display_picture" column="display_picture"/>
+		<result property="created_on" column="created_on"/>
+		<result property="ext_open_id" column="ext_open_id"/>
+		<result property="ext_name" column="ext_name"/>
+		<result property="ext_type" column="ext_type"/>
+		<result property="location" column="location"/>
+		<result property="baby_nickname" column="baby_nickname"/>
+		<result property="baby_dob" column="baby_dob"/>
+		<result property="baby_gender" column="baby_gender"/>
+		<result property="status_" column="status_"/>
+		<result property="userTel" column="user_tel"/>
+	</resultMap>
+	
+	<!-- 根据id查询user所有信息 -->
+	<select id="selectUserById" parameterType="java.lang.Long" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute" />
+		FROM USER WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据username查询user所有信息 -->
+	<select id="selectUserByUsername" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE USERNAME = #{0}
+	</select>
+	
+	<!-- 通过ext_open_id查询user所有信息 -->
+	<select id="selectUserByExtOpenId" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE EXT_OPEN_ID = #{0}
+	</select>
+	
+	<!-- 添加用户信息到user表中 -->
+	<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO USER 
+			(
+				USERNAME,PASSWORD,TOKEN,DISPLAY_NAME,DISPLAY_PICTURE,
+				CREATED_ON,EXT_OPEN_ID,EXT_NAME,EXT_TYPE,
+				LOCATION,BABY_NICKNAME,BABY_DOB,BABY_GENDER,STATUS_,USER_TEL) 
+		VALUES 
+			(
+				#{username},#{password},#{token},#{display_name},#{display_picture},
+				NOW(),#{ext_open_id},#{ext_name},#{ext_type},
+				#{location},#{baby_nickname},#{baby_dob},#{baby_gender},#{status_}, #{userTel}
+			)
+	</insert>
+	
+	<!-- 根据id修改user表数据 -->
+	<update id="updateUser" parameterType="User">
+		UPDATE USER 
+		<set>
+			<if test="username != null and username != ''">
+				USERNAME = #{username}, 
+			</if>
+			<if test="password != null and password != ''">
+				PASSWORD = #{password}, 
+			</if>
+			<if test="token != null and token != ''">
+				TOKEN = #{token}, 
+			</if>
+			<if test="display_name != null and display_name != ''">
+				DISPLAY_NAME = #{display_name}, 
+			</if>
+			<if test="display_picture != null and display_picture != ''">
+				DISPLAY_PICTURE = #{display_picture}, 
+			</if>
+			<if test="ext_open_id != null and ext_open_id != ''">
+				EXT_OPEN_ID = #{ext_open_id}, 
+			</if>
+			<if test="ext_name != null and ext_name != ''">
+				EXT_NAME = #{ext_name}, 
+			</if>
+			<if test="ext_type != null and ext_type != ''">
+				EXT_TYPE = #{ext_type}, 
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION = #{location}, 
+			</if>
+			<if test="baby_nickname != null and baby_nickname != ''">
+				BABY_NICKNAME = #{baby_nickname}, 
+			</if>
+			<if test="baby_dob != null and baby_dob != ''">
+				BABY_DOB = #{baby_dob}, 
+			</if>
+			<if test="baby_gender != null and baby_gender != ''">
+				BABY_GENDER = #{baby_gender}, 
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_ = #{status_},
+			</if>
+			<if test="userTel != null and userTel != ''">
+				USER_TEL = #{userTel} 
+			</if>
+		</set>
+		WHERE 
+			ID = #{id} 
+	</update>
+	
+	<!-- 根据id修改user表的个人头像 -->
+	<update id="updateDisplayPicture">
+		UPDATE USER SET DISPLAY_PICTURE = #{0} WHERE ID = #{1} 
+	</update>
+	
+	<!-- 根据用户名和密码查询用户表信息 -->
+	<select id="validateUser" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE USERNAME=#{0} AND PASSWORD=#{1} 
+	</select>
+	
+	<!-- 通过id修改用户表密码 -->
+	<update id="changePassword">
+		UPDATE USER SET PASSWORD=#{1} WHERE ID=#{0}
+	</update>
+	
+	<!-- 通过token查询user表所有信息 -->
+	<select id="selectUserByToken" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE TOKEN=#{0} 
+	</select>
+	
+	<!-- 根据id修改token值 -->
+	<update id="updateUserToken">
+		UPDATE USER SET TOKEN=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 根据id修改user表的用户名 -->
+	<update id="updateUserName">
+		UPDATE USER SET USERNAME=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 通过key_查询sys_config表数据 -->
+	<select id="selectConfig" parameterType="java.lang.String" resultType="String">
+		SELECT VALUE_ FROM SYS_CONFIG WHERE KEY_ = #{0}
+	</select>
+	
+	<!-- USER_AVATOR表中添加数据 -->
+	<insert id="insertUserAvator">
+		INSERT INTO USER_AVATOR (USER_ID, AVATOR) VALUE (#{0}, #{1})
+	</insert>
+	
+	<!-- 通过user_id修改USER_AVATOR表数据 -->
+	<update id="updateUserAvator">
+		UPDATE USER_AVATOR SET AVATOR = #{1} WHERE USER_ID = #{0}
+	</update>
+	
+	<!-- 根据user_id查询USER_AVATOR表数据 -->
+	<select id="selectUserAvator" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT avator FROM USER_AVATOR WHERE USER_ID = #{id}
+	</select>
+	
+	<!-- 根据user_id查询USER_AVATOR表数据 -->
+	<select id="getOtherUserByTel" parameterType="java.util.Map" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute"/> 
+		FROM 
+			USER 
+		WHERE 
+			USER_TEL = #{phone} 
+				AND 
+			ID != #{userId} 
+				AND 
+			STATUS_ = 'ACTIVE' 
+		LIMIT 
+			0, 1
+	</select>
+	
+	<select id="getAll" parameterType="java.util.Map" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute"/> 
+		FROM 
+			USER
+		LIMIT
+			#{start}, #{end}
+	</select>
+</mapper>

+ 33 - 0
iamberry-app-service/.svn/pristine/94/94f8bfeae43f9f4c6212905f97d847ae200de6e6.svn-base

@@ -0,0 +1,33 @@
+package com.iamberry.app.start;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.support.AbstractApplicationContext;
+
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.service.MilkServiceImpl;
+import com.iamberry.app.ulitity.Utility;
+
+@ImportResource("classpath:iamberry-app-service-spring.xml")
+@SpringBootApplication
+public class InitApp {
+    @Bean
+    public CountDownLatch closeLatch() {
+        return new CountDownLatch(1);
+    }
+	public static void main(String[] args) throws Exception {
+		AbstractApplicationContext ctx = (AbstractApplicationContext) new SpringApplicationBuilder().sources(InitApp.class).web(false).run(args);
+		CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
+		
+		System.out.println(ctx.getBean(MilkServiceImpl.class).getMilkRecordByDate("0020002518fe34d45136", "2016"));
+		
+		closeLatch.await();
+	}
+}

+ 13 - 0
iamberry-app-service/.svn/pristine/9e/9e8c3cae6cd5770f9af5030fd24fd7e10f45a981.svn-base

@@ -0,0 +1,13 @@
+package com.iamberry.app.mapper;
+
+import com.iamberry.app.core.entity.SysLog;
+
+public interface LogMapper {
+
+	/**
+	 * insertSysLog
+	 * @param sysLog
+	 */
+	public void insertSysLog(SysLog log);
+
+}

+ 408 - 0
iamberry-app-service/.svn/pristine/9e/9ef20ad208522b072f32f947ca92f5a6a455a5e3.svn-base

@@ -0,0 +1,408 @@
+package com.iamberry.app.service;
+
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.dto.RemoteIpInfoDTO;
+import com.iamberry.app.core.dto.UserDTO;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.tool.util.AES;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.MD5;
+import com.iamberry.app.tool.util.TuyaConnector;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+/**
+ * UserService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:29
+ */
+@Service
+public class UserServiceImpl extends BaseService implements UserService {
+	
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+
+	/**
+	 * register
+	 *
+	 * @author Moon Cheng
+	 * @param phone 电话号码
+	 * @param password 密码
+	 * @param ip ip地址
+	 * @return User Information
+	 */
+	@Transactional
+	public User register(String phone, String password, String ip) {
+		User user = new User(phone, MD5.md5(password), new Date(), Constants.USER_SAVE_TEL);
+		user.setUserTel(phone);															// 完善手机号码
+		String defaultName = phone.substring(0, 3) + "****" + phone.substring(7, 11);	// 默认的昵称
+		user.setDisplay_name(defaultName);
+		user.setStatus_(Constants.USER_SAVE_TEL);										// 当前用户的状态为已完善手机号码,待完善宝宝信息
+		user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1")); 		// 设置宝宝生日
+		RemoteIpInfoDTO dto = getLocation(ip);
+		if (dto != null) {
+			try {
+				user.setLocation(dto.getCity());
+			} catch (Exception e) {
+				user.setLocation("未知");
+			}
+		}
+		
+		// 在此,生成用户的保存区间,保证系统调用成功,通过手机号hash 定位当前区间
+//		int interval = phone.hashCode() % 10;
+		
+		user.setCreated_on(new Date());													// 创建时间为当前时间
+		userMapper.insertUser(user);
+		
+		if (user.getId() == null) {
+			return null;
+		}
+
+		// 生成token,并且保证修改到数据库
+		String token = getEncToken(user.getId());
+		user.setToken(token);
+		user.setPassword(null);
+		
+		// 返回数据
+		return user;
+	}
+
+	/**
+	 * thirdPartBindingPhone
+	 * @param phone
+	 * @param openId
+	 * @return
+	 */
+	public User thirdPartBindingPhone(String phone, String openId) {
+		// 判断用户是否存在
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			return null;
+		}
+		// 用户已经完善手机号码,不需要完善
+		if (!user.getStatus_().equals(Constants.USER_NOW_INIT)) {
+			return null;
+		}
+		
+		
+		// 根据手机号码,完善信息
+		User db = new User();
+		db.setUserTel(phone);
+		db.setStatus_(Constants.USER_SAVE_TEL);
+		db.setId(user.getId());
+		
+		int status = userMapper.updateUser(db);
+		if (status > 0) {
+			user.setUsername(phone);
+			user.setPassword(null);
+		} else {
+			return null;
+		}
+		user.setStatus_(Constants.USER_SAVE_TEL);
+		return user;
+	}
+
+	/**
+	 * findById
+	 * @param id
+	 * @return User
+	 */
+	public User findById(Long id) {
+		User user = userMapper.selectUserById(id);
+		user.setPassword(null);
+		return user;
+	}
+
+	/**
+	 * login
+	 *
+	 * @param phone
+	 * @param password
+	 * @param userAgent
+	 * @return
+	 */
+	public Object login(String phone, String password) {
+		User user = userMapper.selectUserByUsername(phone);
+		if (user == null) {
+			return -1;
+		}
+		if (!MD5.md5(password).equals(user.getPassword())) {
+			return -2;
+		}
+		if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 待完善宝宝信息
+			user.setIs_perfect_user(2);
+		}
+		// 生成token
+		String token = getEncToken(user.getId());
+		// 将手机号码 -----> username
+		user.setUsername(user.getUserTel());
+		user.setToken(token);
+		user.setPassword(null);
+		// 注册涂鸦
+		UserDTO dto = tuyaConnect(user);
+		if (Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			dto.setIs_perfect_user(1);
+		} else if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 需要完善宝宝信息
+			dto.setIs_perfect_user(2);
+		} else {
+			// 注册完成
+			dto.setIs_perfect_user(3);
+		}
+		return dto;
+	}
+
+	/**
+	 * thirdPartLogin
+	 *
+	 * @param openId
+	 * @param extType
+	 * @param extName
+	 * @param extPicture
+	 * @return
+	 */
+	public User thirdPartLogin(String openId, String extType, String extName, String extPicture, String ip) {
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			// 不存在,则自动注册,如果是第三方登录的用户,默认为刚初始化,需要完善手机号码、宝宝信息,账户才能正常使用
+			user = new User(openId, MD5.md5(Constants.TUYA_DEFAULT_PASS), new Date(), Constants.USER_NOW_INIT);
+			user.setExt_open_id(openId);
+			user.setExt_type(extType);
+			user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1"));
+			user.setDisplay_name(extName.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"));
+			user.setUserTel("");	// 手机号码默认为空
+
+			RemoteIpInfoDTO dto = getLocation(ip);
+			if (dto != null) {
+				user.setLocation(dto.getCity());
+			} else {
+				user.setLocation("默认");
+			}
+
+			user.setDisplay_picture(extPicture);
+			userMapper.insertUser(user);
+		}
+		// 获取token
+		user.setToken(WebJsonTokenUtil.getToken(user.getId().intValue()));
+		user.setPassword(null);
+		user.setUsername(user.getUserTel());
+		return user;
+	}
+
+	/**
+	 * updateUserInfo
+	 *
+	 * @param user
+	 * @param token
+	 * @return
+	 */
+	public User updateUserInfo(User user, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		/*if (!userInfo.getStatus_().equals(Constants.USER_SAVE_TEL)) {
+			return null;
+		}*/
+		
+		/**
+		 * 修改宝宝信息,只需要修改三个字段,宝宝昵称、宝宝性别、宝宝生日,其中默认 修改状态
+		 */
+		if (user.getBaby_dob() != null) {
+			user.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 清楚token,防止修改
+		user.setToken(null);
+		// 修改
+		user.setId(userInfo.getId());
+		userMapper.updateUser(user);
+		
+		// 更新用户信息,并且返回
+		userInfo.setPassword(null);
+		userInfo.setBaby_dob(user.getBaby_dob());
+		userInfo.setBaby_nickname(user.getBaby_nickname());
+		userInfo.setBaby_gender(user.getBaby_gender());
+		userInfo.setStatus_(Constants.USER_ACTIVE);
+		userInfo.setToken(token);
+		return userInfo;
+	}
+
+	/**
+	 * updateDisplayPicture
+	 *
+	 * @author Moon Cheng
+	 * @param base64
+	 * @param token
+	 * @return
+	 */
+	public String updateDisplayPicture(String imageURL, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		/*if (userMapper.updateUserAvator(userInfo.getId(), base64) < 1) {
+			userMapper.insertUserAvator(userInfo.getId(), base64);
+		}*/
+	
+
+		// final String BASE_URL = "http://localhost/imberry-api";
+		int status = userMapper.updateDisplayPicture(imageURL, userInfo.getId());
+		if (status < 1) {
+			return "ERROR";
+		}
+		return imageURL;
+	}
+
+	/**
+	 * changePhone
+	 *
+	 * @author Moon Cheng
+	 * @param phone
+	 * @param token
+	 * @return
+	 */
+	public User changePhone(String phone, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		//  修改绑定的手机号码
+		User user = new User();
+		user.setId(userInfo.getId());
+		user.setUserTel(phone);
+
+		userMapper.updateUser(user);
+		userInfo = userMapper.selectUserById(userInfo.getId());
+		userInfo.setPassword(null);
+		return userInfo;
+	}
+
+	/**
+	 * resetPassWord
+	 *
+	 * @param oldPassword
+	 * @param newPassword
+	 * @param token
+	 * @return
+	 */
+	public int changePassword(String oldPassword, String newPassword, String token) {
+		int status = -1;
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+
+		User user = userMapper.validateUser(userInfo.getUsername(), MD5.md5(oldPassword));
+		if (user == null) {
+			return 0;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	/**
+	 * changePassWord
+	 *
+	 * @param username,
+	 *            newPassword
+	 * @param session
+	 * @return int
+	 */
+	public int resetPassWord(String username, String newPassword) {
+		int status = 0;
+		User user = userMapper.selectUserByUsername(username);
+		if (user == null) {
+			return -3;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	public UserDTO tuyaConnect(User user) {
+		UserDTO userInfo = new UserDTO(user.getId(), user.getUsername(), user.getPassword(), user.getToken(), user.getDisplay_name(),
+				user.getDisplay_picture(), user.getCreated_on(), user.getExt_open_id(), user.getExt_name(), user.getExt_type(),
+				user.getLocation(), user.getBaby_nickname(), user.getBaby_dob(), user.getBaby_gender(), user.getStatus_());
+		userInfo.setPassword(null);
+		try {
+			userInfo.setEncryptUsername(AES.encrypt(user.getUsername()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		userInfo.setUserCode(Constants.TUYA_DEFAULT_PASS);
+		// Tuya connection
+		TuyaConnector.TuyaSyncConnect(userInfo.getEncryptUsername(), userInfo.getUserCode());
+		return userInfo;
+	}
+
+	/**
+	 * getStartPage
+	 *
+	 * @return String
+	 */
+	public String getStartPage() {
+		return userMapper.selectConfig("start_page");
+	}
+
+	/**
+	 * getLocation
+	 *
+	 * @param ip
+	 * @return String
+	 */
+	public RemoteIpInfoDTO getLocation(String ip) {
+		RemoteIpInfoDTO remoteIpInfoDTO = new RemoteIpInfoDTO();
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+		try {
+			String result = HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL, ip));
+			remoteIpInfoDTO = mapper.readValue(result, RemoteIpInfoDTO.class);
+		} catch (Exception e) {
+		}
+		return remoteIpInfoDTO;
+	}
+
+	/**
+	 * getApkVersion
+	 *
+	 * @return
+	 */
+	public String getApkVersion(){
+		return userMapper.selectConfig("apk_version");
+	}
+
+	@Override
+	public String selectUserAvator(Long id) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserAvator(id);
+	}
+
+	@Override
+	public User selectUserByUsername(String username) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserByUsername(username);
+	}
+
+	@Override
+	public List<User> getAll(int start, int end) {
+		// TODO Auto-generated method stub
+		return userMapper.getAll(start, end);
+	}
+
+}

+ 80 - 0
iamberry-app-service/.svn/pristine/a0/a0b5c96675fe102158038d9ef8c7aa4df2ba5437.svn-base

@@ -0,0 +1,80 @@
+package com.iamberry.app.mapper;
+
+import java.util.List;
+
+import com.iamberry.app.core.entity.Message;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.core.serch.SerchParam;
+import com.iamberry.wechat.core.entity.PageBean;
+
+public interface MessageMapper {
+	
+	/**
+	 * 查询符合条件的用户列表
+	 * @return
+	 */
+	public List<User> selectUser(PageBean page);
+	
+	/**
+	 * 获取用户总条数	
+	 * @return
+	 */
+	public int selectUserCount(SerchParam params);
+	
+	/**
+	 * 获取符合条件所有消息
+	 * @return 所有的消息
+	 */
+	public List<Message> selectMessageRecoreds(PageBean page);
+	
+	/**
+	 * 修改一条消息		
+	 * @return 影响的行数
+	 */
+	public int updateMessage(Message message);
+	
+	/**
+	 * 添加一条消息		
+	 * @return 影响的行数
+	 */
+	public int insertMessage(Message message);
+	
+	
+
+	/**
+	 * 获取所有消息的总条数
+	 * @return 所有的消息条数
+	 */
+	public int selectMessageCount(SerchParam params);
+	
+	/**
+	 * 获取系统的所有消息(user为空的)
+	 * @param recordId 用户id
+	 * @return 用户的所有消息
+	 */
+	public List<Message> selectSysMessageRecoreds();
+	
+	/**
+	 * 根据信息id获取信息实体类			
+	 * @param id 信息id
+	 * @return 信息实体类
+	 */
+	public Message selectUserMessageByid(Long id);
+	
+	/**
+	 * 根据用户id获取该用户的所有消息		
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectUserMessageRecoreds(Long userid);
+	
+	
+	/**
+	 * 获取某状态的用户消息			
+	 * @param userid 用户id 
+	 * @param isread 1已读,2 未读
+	 * @return 用户消息集合
+	 */
+	public int selectUserMessageByisread(Long userid,Long isread);
+
+}

+ 4 - 0
iamberry-app-service/.svn/pristine/a1/a112be21c325d37ebc17baafd40c0386b5d09df1.svn-base

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 13 - 0
iamberry-app-service/.svn/pristine/a2/a29da2c9387727a0443ea32197fca2a15446cce8.svn-base

@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8

+ 5 - 0
iamberry-app-service/.svn/pristine/a4/a415529b45b0bb67396c564812685d180cdf4cb4.svn-base

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="java" version="1.8"/>
+  <installed facet="jst.utility" version="1.0"/>
+</faceted-project>

+ 14 - 0
iamberry-app-service/.svn/pristine/a6/a649149e80fea05d97aff6242f09fd9758a6b81b.svn-base

@@ -0,0 +1,14 @@
+#mysql version database setting
+jdbc.driver=com.mysql.jdbc.Driver
+#server user
+jdbc.username=root
+jdbc.password=root
+#jdbc.password=y2kroot
+# default 3
+jdbc.minPoolSize=5
+# default 15
+jdbc.maxPoolSize=10
+# default 3
+jdbc.initialPoolSize=3
+#jdbc.url=jdbc:mysql://cms.iamberry.com:3306/iamberry_app?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
+jdbc.url=jdbc:mysql://192.168.1.254:3306/iamberry_app?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull

+ 31 - 0
iamberry-app-service/.svn/pristine/a7/a78e79d8c942794081ddac9f86ee3697bf1d1100.svn-base

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+					http://www.springframework.org/schema/beans/spring-beans.xsd
+					http://code.alibabatech.com/schema/dubbo          
+   					http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+	<!-- 提供方应用信息,用于计算依赖关系-->
+    <dubbo:application name="iamberry-app-service-provider"/>
+   
+ 	
+    <!-- 用dubbo协议在20880端口暴露服务 -->
+    <dubbo:protocol name="dubbo" port="-1"/>
+    
+ 	<!-- 使用zookeeper注册中心暴露服务地址 -->
+	<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+    
+   <dubbo:monitor protocol="registry"/>
+    
+    <!-- 当ProtocolConfig和ServiceConfig没有设置时,使用默认值 -->
+    <dubbo:provider timeout="30000" threadpool="fixed" threads="500" accepts="100" accesslog="true"/>
+ 
+    <!-- 用dubbo协议在20880端口暴露服务 -->
+    <dubbo:protocol name="dubbo" port="20880"/>
+    <dubbo:service interface="com.iamberry.app.face.MessageService" ref="messageServiceImpl"></dubbo:service>
+    <dubbo:service interface="com.iamberry.app.face.LogService" ref="logServiceImpl"></dubbo:service>
+    <dubbo:service interface="com.iamberry.app.face.UserService" ref="userServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.MilkService" ref="milkServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.MachineService" ref="machineServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.CodeService" ref="codeServiceImpl"></dubbo:service>
+</beans>

+ 54 - 0
iamberry-app-service/.svn/pristine/ac/acd0a1532bbc16638cd765c60dbcfe3dfe334397.svn-base

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	default-autowire="byName"
+	default-lazy-init="true"
+    xmlns:task="http://www.springframework.org/schema/task"
+	xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:ehcache-spring="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:websocket="http://www.springframework.org/schema/websocket" 
+	xsi:schemaLocation=
+		"http://www.springframework.org/schema/aop
+		http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
+		http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd
+		http://www.springframework.org/schema/cache
+		http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
+		http://www.springframework.org/schema/tx 
+		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
+		http://www.springframework.org/schema/task  
+		http://www.springframework.org/schema/task/spring-task-3.1.xsd  
+		http://www.springframework.org/schema/websocket 
+		http://www.springframework.org/schema/websocket/spring-websocket.xsd
+		http://www.springframework.org/schema/context
+		http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+		
+	<!-- 配置自动扫描的包:不扫描控制器和异常处理 -->
+	<context:component-scan base-package="com.iamberry">
+		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
+		<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
+	</context:component-scan>
+	
+	<!-- 使用CGLIB动态代理 -->
+    <aop:aspectj-autoproxy proxy-target-class="true"/>
+	<!-- 开启注解启动定时器 -->
+    <task:annotation-driven/>
+    
+	<import resource="classpath:iamberry-app-service-datasource.xml"/>
+	
+	<!-- Spring -->
+	<bean class="com.iamberry.zk.SpringContextHolder" lazy-init="false"/>
+	
+	<!-- 通过Dubbo 完成SOA	-->
+    <import resource="classpath:iamberry-app-service-provider.xml"/> 
+    
+    <!-- 启动ZK 上报机器信息的节点 -->
+	<bean class="com.iamberry.zk.StartZK" lazy-init="false"/>
+</beans>

+ 74 - 0
iamberry-app-service/.svn/pristine/b3/b3f73b2346f54c1ba388304baa51bf4c5b21c294.svn-base

@@ -0,0 +1,74 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.iamberry</groupId>
+		<artifactId>iamberry-parent</artifactId>
+		<version>1.0.0</version>
+	</parent>
+
+	<artifactId>iamberry-app-service</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.iamberry</groupId>
+			<artifactId>iamberry-common-tool</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.iamberry</groupId>
+			<artifactId>iamberry-app-interface</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter</artifactId>
+			<exclusions>
+				<exclusion>
+					<artifactId>log4j-over-slf4j</artifactId>
+					<groupId>org.slf4j</groupId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-starter-logging</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+	</dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<version>1.4.1.BUILD-SNAPSHOT</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<mainClass>com.iamberry.service.start.InitApp</mainClass>
+					<layout>JAR</layout>
+					<addResources>true</addResources>
+				</configuration>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.xml</include>
+				</includes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*.*</include>
+				</includes>
+			</resource>
+		</resources>
+	</build>
+</project>

+ 412 - 0
iamberry-app-service/.svn/pristine/b8/b8a6e3d276a2ebf08c6e266102b00851d0f6ca99.svn-base

@@ -0,0 +1,412 @@
+package com.iamberry.app.service;
+
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.dto.RemoteIpInfoDTO;
+import com.iamberry.app.core.dto.UserDTO;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.tool.util.AES;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.MD5;
+import com.iamberry.app.tool.util.TuyaConnector;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+/**
+ * UserService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:29
+ */
+@Service
+public class UserServiceImpl extends BaseService implements UserService {
+	
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+
+	/**
+	 * register
+	 *
+	 * @author Moon Cheng
+	 * @param phone 电话号码
+	 * @param password 密码
+	 * @param ip ip地址
+	 * @return User Information
+	 */
+	@Transactional
+	public User register(String phone, String password, String ip) {
+		User user = new User(phone, MD5.md5(password), new Date(), Constants.USER_SAVE_TEL);
+		user.setUserTel(phone);															// 完善手机号码
+		String defaultName = phone.substring(0, 3) + "****" + phone.substring(7, 11);	// 默认的昵称
+		user.setDisplay_name(defaultName);
+		user.setStatus_(Constants.USER_SAVE_TEL);										// 当前用户的状态为已完善手机号码,待完善宝宝信息
+		user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1")); 		// 设置宝宝生日
+		RemoteIpInfoDTO dto = getLocation(ip);
+		if (dto != null) {
+			try {
+				user.setLocation(dto.getCity());
+			} catch (Exception e) {
+				user.setLocation("未知");
+			}
+		}
+		
+		// 在此,生成用户的保存区间,保证系统调用成功,通过手机号hash 定位当前区间
+//		int interval = phone.hashCode() % 10;
+		
+		user.setCreated_on(new Date());													// 创建时间为当前时间
+		userMapper.insertUser(user);
+		
+		if (user.getId() == null) {
+			return null;
+		}
+
+		// 生成token,并且保证修改到数据库
+		String token = getEncToken(user.getId());
+		user.setToken(token);
+		user.setPassword(null);
+		
+		// 返回数据
+		return user;
+	}
+
+	/**
+	 * thirdPartBindingPhone
+	 * @param phone
+	 * @param openId
+	 * @return
+	 */
+	public User thirdPartBindingPhone(String phone, String openId) {
+		// 判断用户是否存在
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			return null;
+		}
+		// 用户已经完善手机号码,不需要完善
+		if (!user.getStatus_().equals(Constants.USER_NOW_INIT)) {
+			return null;
+		}
+		
+		
+		// 根据手机号码,完善信息
+		User db = new User();
+		db.setUserTel(phone);
+		db.setStatus_(Constants.USER_SAVE_TEL);
+		db.setId(user.getId());
+		
+		int status = userMapper.updateUser(db);
+		if (status > 0) {
+			user.setUsername(phone);
+			user.setPassword(null);
+		} else {
+			return null;
+		}
+		user.setStatus_(Constants.USER_SAVE_TEL);
+		return user;
+	}
+
+	/**
+	 * findById
+	 * @param id
+	 * @return User
+	 */
+	public User findById(Long id) {
+		User user = userMapper.selectUserById(id);
+		user.setPassword(null);
+		return user;
+	}
+
+	/**
+	 * login
+	 *
+	 * @param phone
+	 * @param password
+	 * @param userAgent
+	 * @return
+	 */
+	public Object login(String phone, String password) {
+		User user = userMapper.selectUserByUsername(phone);
+		if (user == null) {
+			return -1;
+		}
+		if (!MD5.md5(password).equals(user.getPassword())) {
+			return -2;
+		}
+		if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 待完善宝宝信息
+			user.setIs_perfect_user(2);
+		}
+		// 生成token
+		String token = getEncToken(user.getId());
+		// 将手机号码 -----> username
+		user.setUsername(user.getUserTel());
+		user.setToken(token);
+		user.setPassword(null);
+		// 注册涂鸦
+		UserDTO dto = tuyaConnect(user);
+		if (Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			dto.setIs_perfect_user(1);
+		} else if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 需要完善宝宝信息
+			dto.setIs_perfect_user(2);
+		} else {
+			// 注册完成
+			dto.setIs_perfect_user(3);
+		}
+		return dto;
+	}
+
+	/**
+	 * thirdPartLogin
+	 *
+	 * @param openId
+	 * @param extType
+	 * @param extName
+	 * @param extPicture
+	 * @return
+	 */
+	public User thirdPartLogin(String openId, String extType, String extName, String extPicture, String ip) {
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			// 不存在,则自动注册,如果是第三方登录的用户,默认为刚初始化,需要完善手机号码、宝宝信息,账户才能正常使用
+			user = new User(openId, MD5.md5(Constants.TUYA_DEFAULT_PASS), new Date(), Constants.USER_NOW_INIT);
+			user.setExt_open_id(openId);
+			user.setExt_type(extType);
+			user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1"));
+			user.setDisplay_name(extName.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"));
+			user.setUserTel("");	// 手机号码默认为空
+
+			RemoteIpInfoDTO dto = getLocation(ip);
+			if (dto != null) {
+				user.setLocation(dto.getCity());
+			} else {
+				user.setLocation("默认");
+			}
+
+			user.setDisplay_picture(extPicture);
+			userMapper.insertUser(user);
+		}
+		// 获取token
+		user.setToken(WebJsonTokenUtil.getToken(user.getId().intValue()));
+		user.setPassword(null);
+		user.setUsername(user.getUserTel());
+		return user;
+	}
+
+	/**
+	 * updateUserInfo
+	 *
+	 * @param user
+	 * @param token
+	 * @return
+	 */
+	public User updateUserInfo(User user, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		/*if (!userInfo.getStatus_().equals(Constants.USER_SAVE_TEL)) {
+			return null;
+		}*/
+		
+		/**
+		 * 修改宝宝信息,只需要修改三个字段,宝宝昵称、宝宝性别、宝宝生日,其中默认 修改状态
+		 */
+		if (user.getBaby_dob() != null) {
+			user.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 清楚token,防止修改
+		user.setToken(null);
+		// 修改
+		user.setId(userInfo.getId());
+		userMapper.updateUser(user);
+		
+		// 更新用户信息,并且返回
+		userInfo.setPassword(null);
+		userInfo.setBaby_dob(user.getBaby_dob());
+		userInfo.setBaby_nickname(user.getBaby_nickname());
+		userInfo.setBaby_gender(user.getBaby_gender());
+		userInfo.setStatus_(Constants.USER_ACTIVE);
+		userInfo.setToken(token);
+		if(StringUtils.isNotEmpty(user.getDisplay_name())){
+			userInfo.setDisplay_name(user.getDisplay_name());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * updateDisplayPicture
+	 *
+	 * @author Moon Cheng
+	 * @param base64
+	 * @param token
+	 * @return
+	 */
+	public String updateDisplayPicture(String imageURL, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		/*if (userMapper.updateUserAvator(userInfo.getId(), base64) < 1) {
+			userMapper.insertUserAvator(userInfo.getId(), base64);
+		}*/
+	
+
+		// final String BASE_URL = "http://localhost/imberry-api";
+		int status = userMapper.updateDisplayPicture(imageURL, userInfo.getId());
+		if (status < 1) {
+			return "ERROR";
+		}
+		return imageURL;
+	}
+
+	/**
+	 * changePhone
+	 *
+	 * @author Moon Cheng
+	 * @param phone
+	 * @param token
+	 * @return
+	 */
+	public User changePhone(String phone, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		//  修改绑定的手机号码
+		User user = new User();
+		user.setId(userInfo.getId());
+		user.setUserTel(phone);
+
+		userMapper.updateUser(user);
+		userInfo = userMapper.selectUserById(userInfo.getId());
+		userInfo.setPassword(null);
+		return userInfo;
+	}
+
+	/**
+	 * resetPassWord
+	 *
+	 * @param oldPassword
+	 * @param newPassword
+	 * @param token
+	 * @return
+	 */
+	public int changePassword(String oldPassword, String newPassword, String token) {
+		int status = -1;
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+
+		User user = userMapper.validateUser(userInfo.getUsername(), MD5.md5(oldPassword));
+		if (user == null) {
+			return 0;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	/**
+	 * changePassWord
+	 *
+	 * @param username,
+	 *            newPassword
+	 * @param session
+	 * @return int
+	 */
+	public int resetPassWord(String username, String newPassword) {
+		int status = 0;
+		User user = userMapper.selectUserByUsername(username);
+		if (user == null) {
+			return -3;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	public UserDTO tuyaConnect(User user) {
+		UserDTO userInfo = new UserDTO(user.getId(), user.getUsername(), user.getPassword(), user.getToken(), user.getDisplay_name(),
+				user.getDisplay_picture(), user.getCreated_on(), user.getExt_open_id(), user.getExt_name(), user.getExt_type(),
+				user.getLocation(), user.getBaby_nickname(), user.getBaby_dob(), user.getBaby_gender(), user.getStatus_());
+		userInfo.setPassword(null);
+		try {
+			userInfo.setEncryptUsername(AES.encrypt(user.getUsername()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		userInfo.setUserCode(Constants.TUYA_DEFAULT_PASS);
+		// Tuya connection
+		TuyaConnector.TuyaSyncConnect(userInfo.getEncryptUsername(), userInfo.getUserCode());
+		return userInfo;
+	}
+
+	/**
+	 * getStartPage
+	 *
+	 * @return String
+	 */
+	public String getStartPage() {
+		return userMapper.selectConfig("start_page");
+	}
+
+	/**
+	 * getLocation
+	 *
+	 * @param ip
+	 * @return String
+	 */
+	public RemoteIpInfoDTO getLocation(String ip) {
+		RemoteIpInfoDTO remoteIpInfoDTO = new RemoteIpInfoDTO();
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+		try {
+			String result = HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL, ip));
+			remoteIpInfoDTO = mapper.readValue(result, RemoteIpInfoDTO.class);
+		} catch (Exception e) {
+		}
+		return remoteIpInfoDTO;
+	}
+
+	/**
+	 * getApkVersion
+	 *
+	 * @return
+	 */
+	public String getApkVersion(){
+		return userMapper.selectConfig("apk_version");
+	}
+
+	@Override
+	public String selectUserAvator(Long id) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserAvator(id);
+	}
+
+	@Override
+	public User selectUserByUsername(String username) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserByUsername(username);
+	}
+
+	@Override
+	public List<User> getAll(int start, int end) {
+		// TODO Auto-generated method stub
+		return userMapper.getAll(start, end);
+	}
+
+}

+ 173 - 0
iamberry-app-service/.svn/pristine/b8/b8adeb7d5fc32ee5b18f860f52eb371555f5d027.svn-base

@@ -0,0 +1,173 @@
+package com.iamberry.app.service;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.http.ParseException;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.entity.Machine;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.MachineService;
+import com.iamberry.app.tool.util.HttpUtility;
+
+/**
+ * MachineService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午12:27:32
+ */
+@Service
+public class MachineServiceImpl extends BaseService implements MachineService {
+
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+	
+	/**
+	 * setMachine
+	 * @author Moon Cheng
+	 * @param machine
+	 * @param token
+	 * @return Machine Information
+	 */
+	@Transactional
+	public Machine setMachine(Machine machine, String token, String ip) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+
+		String location = null;
+		try {
+			location = new JSONObject(
+					HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL,ip)))
+							.getString("city");
+		} catch (ParseException | IOException | JSONException e) {
+			e.printStackTrace();
+		}
+		machine.setLocation(location);
+
+		machine.setOwner(userInfo.getId());
+		Long machineId = machineMapper.isDevUserPairExist(machine.getMachine_mac(), userInfo.getId());
+		machine.setCreated_on(new Date());
+		if (machineId == null) {
+			machineMapper.insertMachine(machine);
+		} else {
+			machine.setId(machineId);
+			machineMapper.updateMachine(machine);
+		}
+		return machine;
+	}
+
+	/**
+	 * updateMachineStatus
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param status
+	 * @param token
+	 * @return
+	 */
+	public int updateMachineStatus(Long machineId, String status, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		return machineMapper.updateMachineStatus(status, machineId);
+	}
+
+	/**
+	 * updateMachineLocation
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param location
+	 * @param token
+	 * @return
+	 */
+	public int updateMachineLocation(Long machineId, String location, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		return machineMapper.updateMachineLocation(location, machineId);
+	}
+
+	/**
+	 * 	按用户,查询所有机器
+	 * @param owner
+	 * @param token
+	 * @return
+	 */
+	public List<Machine> searchMachineByOwner(Long owner, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		List<Machine> machines = machineMapper.selectMachineByOwner(owner);
+		return machines;
+	}
+
+	/**
+	 * searchMachineById
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param token
+	 * @return
+	 */
+	public Machine searchMachineById(Long machineId, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		Machine machine = machineMapper.selectMachineById(machineId);
+		return machine;
+	}
+
+	/**
+	 * updateStatus
+	 *
+	 * @param status
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional
+	public void updateStatus(String status) {
+		// the method is expensive!
+		Map<String, Object> map = new HashMap<>();
+		try {
+			map = mapper.readValue(status,new HashMap<String, Object>().getClass());
+			
+		} catch (IOException e) {
+			logger.error(e.getMessage());
+			e.printStackTrace();
+		}
+		for (Entry<String, Object> entry : map.entrySet()) {
+			if (entry.getValue() instanceof String) {
+				machineMapper.updateStatusByMac(entry.getKey(),  entry.getValue().equals("0") ? "online" : "offline");
+			} else {
+				machineMapper.updateStatusByMac(entry.getKey(),  (Integer)entry.getValue() == 0 ? "online" : "offline");
+			}
+		}
+	}
+
+	@Override
+	public Long selectUserIDByDevId(String devId) {
+		// TODO Auto-generated method stub
+		return machineMapper.selectUserIDByDevId(devId);
+	}
+}

+ 50 - 0
iamberry-app-service/.svn/pristine/bc/bc4cc088d1e577a74bb296e781ccb68c5d56430a.svn-base

@@ -0,0 +1,50 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.core.entity.User;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码 SQL Mapper映射
+ */
+public interface CodeMapper {
+
+	/**
+	 * 保存一条发送记录
+	 * @param codeValid
+	 * @return
+	 */
+	public int save(CodeValid codeValid);
+	
+	/**
+	 * 获取某一个手机号码最后的发送记录
+	 * @param phone
+	 * @return
+	 */
+	public CodeValid getLast(String phone);
+	
+	/**
+	 * 更新状态
+	 * @param codeId
+	 * @return
+	 */
+	public int update(Long codeId);
+	
+	/**
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public int getInterval(@Param("startDate") Date startDate, @Param("enDate") Date endDate, @Param("phone")String phone);
+}

+ 134 - 0
iamberry-app-service/.svn/pristine/c4/c4387a5ebd16d725157a6fccb9371f1f72894085.svn-base

@@ -0,0 +1,134 @@
+package com.iamberry.app.sqlprovider;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.ibatis.jdbc.SQL;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+/**
+ * 
+ * @author Sikandar
+ * @date 2016年1月18日 下午9:34:48
+ */
+public class DMLProvider {
+
+	/**
+	 * update
+	 * 
+	 * @param map
+	 * @return String
+	 * @throws Exception
+	 */
+	public String update(Map<String, Object> map) {
+		try {
+			final String entityName = getEntityName(map);
+			final Object object_ = map.get(entityName);
+			final Class<?> cls = Class.forName(object_.getClass().getName());
+			SQL sql = new SQL() {
+				{
+					Object id = null;
+					UPDATE(entityName);
+					for (Method method : cls.getDeclaredMethods()) {
+						String mName = method.getName();
+						if (mName.startsWith("get")) {
+							Object rValue = method.invoke(object_);
+							if (mName.equalsIgnoreCase("getId")) {
+								id = rValue;
+							} else {
+								if (method.getReturnType() == String.class) {
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + " = '" + rValue + "'");
+								} else if (method.getReturnType() == Date.class) {
+
+									SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + " = '" + format.format(rValue) + "'");
+								} else {
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + "=" + rValue.toString());
+								}
+							}
+						}
+					}
+
+					WHERE("id = " + id);
+				}
+			};
+
+			return sql.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * insert
+	 * 
+	 * @param map
+	 * @return String
+	 */
+	public String insert(Map<String, Object> map) {
+		try {
+
+			final String entityName = getEntityName(map);
+			final Object object_ = map.get(entityName);
+			final Class<?> cls = Class.forName(object_.getClass().getName());
+			SQL sql = new SQL() {
+				{
+					INSERT_INTO(entityName);
+					for (Method method : cls.getDeclaredMethods()) {
+						String mName = method.getName();
+						if (mName.startsWith("get")) {
+							Object rValue = method.invoke(object_);
+							if (method.getReturnType() == String.class) {
+								if (rValue == null)
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "" + rValue + "");
+								else
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "'" + rValue + "'");
+							} else if (method.getReturnType() == Date.class) {
+
+								SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+								if (rValue != null)
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "'" + format.format(rValue) + "'");
+								else
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "" + null + "");
+							} else
+								VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), rValue == null ? "0" : rValue.toString());
+						}
+					}
+				}
+			};
+
+			return sql.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+	private String getEntityName(Map<String, Object> map) throws Exception {
+		String entityName = null;
+		for (Object object_ : map.values()) {
+			Class<?> cls = Class.forName(object_.getClass().getName());
+			for (Annotation annotation : cls.getAnnotations()) {
+				if (annotation instanceof Qualifier) {
+					Qualifier myAnnotation = (Qualifier) annotation;
+					entityName = myAnnotation.value();
+				}
+			}
+		}
+
+		if (entityName == null)
+			throw new Exception(
+					"@Qualifier not found, Entity should be defined with @Qualifier name, @Qualifier name must match DataBase table name");
+		return entityName;
+
+	}
+
+}

+ 43 - 0
iamberry-app-service/.svn/pristine/c7/c7eba3856991bd528aacf51a0fa5636aeb6a14fa.svn-base

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.CodeMapper">
+	
+	<!-- 保存一个发送记录 -->
+	<insert id="save" parameterType="CodeValid">
+		INSERT INTO
+			CODE_VALID
+				(
+					CODE_PHONE, CODE_VALUE, CODE_SEND_DATE, CODE_VALID_DATE, 
+					CODE_STATUS, CODE_MSG, CODE_CHANNEL, CODE_USE, CODE_SCENARIO
+				)
+		VALUES
+			(
+				#{codePhone}, #{codeValue}, #{codeSendDate}, #{codeValidDate}, 
+				#{codeStatus}, #{codeMsg}, #{codeChannel}, #{codeUse}, #{codeScenario}
+			)
+	</insert>
+	
+	<!-- 获取用户最近的记录 -->
+	<select id="getLast" parameterType="string" resultType="CodeValid">
+		SELECT 
+			*
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		ORDER BY 
+			CODE_ID DESC
+		LIMIT 0, 1
+	</select>
+	
+	<!-- 根据code_id,更新本次记录状态 -->
+	<update id="update" parameterType="long">
+		UPDATE 
+			CODE_VALID 
+		SET 
+			CODE_USE = 1
+		WHERE 
+			CODE_ID = #{codeID}
+	</update>
+</mapper>

+ 17 - 0
iamberry-app-service/.svn/pristine/cf/cfcd5b8b5e2f1ae3d62ec1a1cdaf78cec6e9bc4a.svn-base

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.LogMapper">
+	
+	<insert id="insertSysLog" parameterType="SysLog">
+		INSERT INTO
+			SYS_LOG
+				(
+					LOG_TYPE, OPERATION, DETAIL, TIMESTAMP_
+				)
+		VALUES
+			(
+				#{log_type}, #{operation}, #{detail}, #{timestamp_}
+			)
+	</insert>
+</mapper>

+ 6 - 0
iamberry-app-service/.svn/pristine/dd/dd8ba1b2aaf14f5f5f1eb48d415562586b2f0f2d.svn-base

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8

+ 38 - 0
iamberry-app-service/.svn/pristine/e8/e831058e9ffbfb5c63884bd0449afd5c863f2e7b.svn-base

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" path="/iamberry-common-tool"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 63 - 0
iamberry-app-service/.svn/pristine/f3/f32f3f75418e6fd316673fbfca6d425ee12b37d8.svn-base

@@ -0,0 +1,63 @@
+package com.iamberry.app.service;
+
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.jpush.api.JPushClient;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.mapper.LogMapper;
+import com.iamberry.app.mapper.MachineMapper;
+import com.iamberry.app.mapper.MessageMapper;
+import com.iamberry.app.mapper.MilkMapper;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+
+@Service
+public class BaseService {
+
+	@Autowired
+	protected UserMapper userMapper;
+	@Autowired
+	protected MachineMapper machineMapper;
+	@Autowired
+	protected MilkMapper milkMapper;
+	@Autowired
+	protected LogMapper logMapper;
+	@Autowired
+	protected MessageMapper messageMapper;
+
+	protected static final ObjectMapper mapper = new ObjectMapper();
+
+	public static JPushClient jpushClient = new JPushClient(ImberryConfig.MASTERSECRET, ImberryConfig.APPKEY);
+
+	protected static final int PAGE_SIZE = 10;
+
+	protected String getEncToken(long userId) {
+		return WebJsonTokenUtil.getToken(Integer.parseInt(userId+""));
+//		String tokenKey = Utility.getRandomString(10);
+//		String base64 = userId + "|" + tokenKey + "|" + System.currentTimeMillis();
+//		return new String(Base64.encodeBase64(base64.getBytes()));
+	}
+
+	public User validateUserToken(String token) {
+		
+		Map<String, Object> map = WebJsonTokenUtil.verifier(token);
+		if ("1".equals(map.get("status").toString())) {
+			// 失败
+			return null;
+		}
+		// 根据id,获取数据
+		User userInfo = userMapper.selectUserById(Long.parseLong(map.get("userid").toString()));
+		if (userInfo == null) {
+			return null;
+		}
+		return userInfo;
+	}
+}

+ 374 - 0
iamberry-app-service/.svn/pristine/f8/f82f947c962674daed06830f08b211b43cd1387d.svn-base

@@ -0,0 +1,374 @@
+package com.iamberry.app.ulitity;
+
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.core.dto.RecordDTO;
+import com.iamberry.app.tool.dto.AddressDTO;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.JsonParseUtil;
+import com.iamberry.app.tool.util.Result;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+public class Utility {
+
+	public static String DATA_STORE = "";
+	private static final String AB = "123456789abcdefghijklmnpqrstuvwxyz";
+
+	private static Random rnd = new Random();
+
+	public static String getDateByDay() {
+		Calendar cal = Calendar.getInstance();
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(cal.get(Calendar.YEAR));
+		buffer.append(cal.get(Calendar.MONTH) + 1);
+		buffer.append(cal.get(Calendar.DAY_OF_MONTH));
+		return buffer.toString();
+	}
+
+	public static boolean contains(String[] array, String item) {
+		try {
+			for (int i = 0; i < array.length; i++) {
+				if (array[i].equals(item)) {
+					return true;
+				}
+			}
+		} catch (Exception ex) {
+
+		}
+		return false;
+	}
+
+	public static String normalizePath(String path) {
+		return path.replace("\\\\", "\\").replace("\\", "/").replace("//", "/").replace("..", ".");
+	}
+
+	public static String getRandomString(int len) {
+		StringBuilder sb = new StringBuilder(len);
+		for (int i = 0; i < len; i++)
+			sb.append(AB.charAt(rnd.nextInt(AB.length())));
+		return sb.toString();
+	}
+
+	public static int CalculateAge(Long date) {
+		Date birthDate = new Date(0);
+		if (date != null)
+			birthDate = new Date(date);
+		SimpleDateFormat format = new SimpleDateFormat("yyyy");
+		int birthYear = Integer.parseInt(format.format(birthDate));
+		int currentYear = Integer.parseInt(format.format(new Date(System.currentTimeMillis())));
+		int age = currentYear - birthYear;
+
+		return age;
+	}
+
+	public static List<RecordDTO> convertMap(List<Map<String, Object>> list, String dateType) {
+		List<RecordDTO> maps = new ArrayList<RecordDTO>();
+		try {
+			SimpleDateFormat sdf = null;
+			for (Map<String, Object> map : list) {
+				switch (dateType) {
+				case "days":
+					sdf = new SimpleDateFormat("yyyyMMddHH");
+					break;
+				case "weeks":
+					sdf = new SimpleDateFormat("yyyyMMdd");
+					break;
+				case "years":
+					sdf = new SimpleDateFormat("yyyyMM");
+					break;
+				}
+				Date key = sdf.parse(map.get(dateType).toString());
+				Double value = Double.parseDouble(map.get("volume").toString());
+				maps.add(new RecordDTO(key.getTime(), value));
+			}
+		} catch (Exception e) {
+		}
+		return maps;
+	}
+
+	public static Map<String, List<RecordDTO>> synAppMachineRecord(Map<String, List<RecordDTO>> oldMap) {
+		Map<String, List<RecordDTO>> synMap = oldMap;
+		int appSize = synMap.get("app").size();
+		int machineSize = synMap.get("machine").size();
+		int signer = 0;
+		long appDate = 0l, machineDate = 0l;
+		RecordDTO appRecord, machineRecord;
+		for (int i = 0; i < appSize && i < machineSize; i++) {
+			appRecord = synMap.get("app").get(i);
+			machineRecord = synMap.get("machine").get(signer);
+			appDate = appRecord.getRecordDate();
+			machineDate = machineRecord.getRecordDate();
+			if (appDate == machineDate) {
+				signer++;
+			} else if (appDate < machineDate) {
+				synMap.get("machine").add(i, new RecordDTO(appDate, 0));
+				machineSize++;
+				signer++;
+			} else {
+				synMap.get("app").add(signer, new RecordDTO(machineDate, 0));
+				appSize++;
+				signer++;
+			}
+		}
+		while (signer < machineSize) {
+			synMap.get("app").add(new RecordDTO(synMap.get("machine").get(signer).getRecordDate(), 0));
+			signer++;
+		}
+		while (signer < appSize) {
+			synMap.get("machine").add(new RecordDTO(synMap.get("app").get(signer).getRecordDate(), 0));
+			signer++;
+		}
+		return synMap;
+	}
+
+	public static Map<String, List<RecordDTO>> fillAppMachineRecordWithZero(Map<String, List<RecordDTO>> synedMap, String dataType,
+			String chosenDate) {
+		Map<String, List<RecordDTO>> fillMap = synedMap;
+		Calendar calendar = Calendar.getInstance();
+		List<Integer> existTimePoint = new ArrayList<Integer>();
+		long timePoint = 0l;
+		switch (dataType) {
+		case "days":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.HOUR_OF_DAY));
+			});
+			for (int i = 0; i < 24; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.HOUR_OF_DAY, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i, new RecordDTO(timePoint, 0));
+				}
+			}
+			break;
+		case "weeks":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.DAY_OF_WEEK));
+			});
+			if (existTimePoint.contains(new Integer(1))) {
+				calendar.add(Calendar.DATE, -7);
+			}
+			for (int i = 2; i <= 7; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.DAY_OF_WEEK, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i - 2, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i - 2, new RecordDTO(timePoint, 0));
+				}
+			}
+			if (!existTimePoint.contains(new Integer(1))) {
+				calendar.add(Calendar.DATE, 7);
+				calendar.set(Calendar.DAY_OF_WEEK, 1);
+				timePoint = calendar.getTimeInMillis();
+				fillMap.get("app").add(new RecordDTO(timePoint, 0));
+				fillMap.get("machine").add(new RecordDTO(timePoint, 0));
+			}
+			break;
+		case "years":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.MONTH));
+			});
+			for (int i = 0; i <= 11; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.MONTH, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i, new RecordDTO(timePoint, 0));
+				}
+			}
+			break;
+		}
+		return fillMap;
+	}
+
+	public static String getRandomCode(int len) {
+		StringBuilder sb = new StringBuilder(len);
+		for (int i = 0; i < len; i++)
+			sb.append("0123456789".charAt(rnd.nextInt("0123456789".length())));
+		return sb.toString();
+	}
+
+	public static String getIp(HttpServletRequest request) {
+		String ip = request.getHeader("x-forwarded-for");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		return ip;
+	}
+
+	public static String CDN_WRITE_BASE_64_URL = "http://cms.iamberry.com/open-cdn/ssl/data/write/base64";
+
+	public static String uploadBase64File(String base64Data, String path) {
+		try {
+			if (base64Data != null) {
+				StringBody pic = new StringBody(base64Data, ContentType.DEFAULT_TEXT);
+				StringBody type = new StringBody("jpg", ContentType.TEXT_PLAIN);
+				HttpEntity entity = MultipartEntityBuilder.create().addPart("type", type).addPart("base64data", pic)
+						.build();
+				String result = HttpUtility.httpsPost(CDN_WRITE_BASE_64_URL, entity);
+
+				JSONObject json = new JSONObject(result);
+				int requestSatus = json.getJSONObject("header").getInt("status");
+				if (1000 == requestSatus) {
+					path = json.getJSONObject("data").get("url").toString();
+				}
+
+				return path;
+			}
+		} catch (Exception e) {
+			return null;
+		}
+		return "";
+	}
+
+	public static String readFile(InputStream in) {
+		BufferedReader reader = null;
+		String result = "";
+		try {
+			InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8");
+			reader = new BufferedReader(inputStreamReader);
+			String tempString = null;
+			while ((tempString = reader.readLine()) != null) {
+				result += tempString;
+			}
+			reader.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (reader != null) {
+				try {
+					reader.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return result;
+	}
+
+	public static String sendCodeAsSMS(String phoneNum, Map<String, Integer> status) throws Exception {
+		String code = getRandomCode(4);
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phoneNum);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close();
+			status.put(Constants.SMS_RETURNCODE, object.getResultcode());
+			if (0 == object.getResultcode()) {
+				return code;
+			}
+		}
+		return null;
+	}
+
+	public static AddressDTO getDefaultAddress(String jsonList) {
+		List<AddressDTO> addressDTOs = JsonParseUtil.parseAddressList(jsonList);
+		for (AddressDTO addressDTO : addressDTOs) {
+			if (addressDTO.getDefaultAddress() == 1) {
+				return addressDTO;
+			}
+		}
+		return null;
+	}
+
+	public static String getOrderSn(Long id) {
+		if (id == null)
+			throw new NullPointerException("id can not be null");
+
+		SimpleDateFormat format = new SimpleDateFormat("yyMMdd");
+		String date = format.format(new Date());
+		String sn = String.format("%0" + 5 + "d", id);
+		return "LTR" + date + sn;
+	}
+
+	public static String formatDateToString(String format, Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat(format);
+		return sdf.format(date);
+	}
+
+	public static Date formatStringToDate(String format, String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat(format);
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+			date = new Date();
+		}
+		return date;
+	}
+
+}

BIN
iamberry-app-service/.svn/wc.db


+ 74 - 0
iamberry-app-service/pom.xml

@@ -0,0 +1,74 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.iamberry</groupId>
+		<artifactId>iamberry-parent</artifactId>
+		<version>1.0.0</version>
+	</parent>
+
+	<artifactId>iamberry-app-service</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.iamberry</groupId>
+			<artifactId>iamberry-common-tool</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.iamberry</groupId>
+			<artifactId>iamberry-app-interface</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter</artifactId>
+			<exclusions>
+				<exclusion>
+					<artifactId>log4j-over-slf4j</artifactId>
+					<groupId>org.slf4j</groupId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-starter-logging</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+	</dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<version>1.4.1.BUILD-SNAPSHOT</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<mainClass>com.iamberry.service.start.InitApp</mainClass>
+					<layout>JAR</layout>
+					<addResources>true</addResources>
+				</configuration>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.xml</include>
+				</includes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*.*</include>
+				</includes>
+			</resource>
+		</resources>
+	</build>
+</project>

+ 50 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/CodeMapper.java

@@ -0,0 +1,50 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.core.entity.User;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码 SQL Mapper映射
+ */
+public interface CodeMapper {
+
+	/**
+	 * 保存一条发送记录
+	 * @param codeValid
+	 * @return
+	 */
+	public int save(CodeValid codeValid);
+	
+	/**
+	 * 获取某一个手机号码最后的发送记录
+	 * @param phone
+	 * @return
+	 */
+	public CodeValid getLast(String phone);
+	
+	/**
+	 * 更新状态
+	 * @param codeId
+	 * @return
+	 */
+	public int update(Long codeId);
+	
+	/**
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public int getInterval(@Param("startDate") Date startDate, @Param("enDate") Date endDate, @Param("phone")String phone);
+}

+ 13 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/LogMapper.java

@@ -0,0 +1,13 @@
+package com.iamberry.app.mapper;
+
+import com.iamberry.app.core.entity.SysLog;
+
+public interface LogMapper {
+
+	/**
+	 * insertSysLog
+	 * @param sysLog
+	 */
+	public void insertSysLog(SysLog log);
+
+}

+ 76 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/MachineMapper.java

@@ -0,0 +1,76 @@
+package com.iamberry.app.mapper;
+
+import java.util.List;
+
+import com.iamberry.app.core.entity.Machine;
+
+public interface MachineMapper {
+
+	/**
+	 *	添加一台机器
+	 * @param machine
+	 * @return void
+	 */
+	public void insertMachine(Machine machine);
+
+	/**
+	 *	根据id 修改一台机器信息
+	 * @param machine
+	 */
+	public void updateMachine(Machine machine);
+
+	/**
+	 * 根据机器id 修改个人机器状态,增加修改时间为当前时间的字段
+	 * 取消数据库中表machine的时间修改字段自动更新!
+	 * @param status,
+	 *            id
+	 */
+	public int updateMachineStatus(String status,Long id);
+
+	/**
+	 *	根据id 修改一台机器的位置信息
+	 * @param location,
+	 *            id
+	 * @return void
+	 */
+	public int updateMachineLocation(String location,Long id);
+
+	/**
+	 *	按用户,查询所有机器
+	 * @author Moon Cheng
+	 * @param owner
+	 * @return
+	 */
+	public List<Machine> selectMachineByOwner(Long owner);
+
+	/**
+	 * 	根据id 查询一台机器
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public Machine selectMachineById(Long id);
+	
+	/**
+	 * 	根据机器码和所属用户 查一台机器id
+	 * @param devId
+	 * @param userId
+	 * @return
+	 */ 
+	public Long isDevUserPairExist(String devId, Long userId);
+	
+	/**
+	 * 	根据机器码 修改个人机器状态,增加修改时间为当前时间的字段
+	 *
+	 * @param mac
+	 * @param status
+	 */
+	public void updateStatusByMac(String devId, String status);
+
+	/**
+	 * 根据机器的ID,查询最近的一个用户ID
+	 * @param devId
+	 * @return
+	 */
+	public Long selectUserIDByDevId(String devId);
+}

+ 80 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/MessageMapper.java

@@ -0,0 +1,80 @@
+package com.iamberry.app.mapper;
+
+import java.util.List;
+
+import com.iamberry.app.core.entity.Message;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.core.serch.SerchParam;
+import com.iamberry.wechat.core.entity.PageBean;
+
+public interface MessageMapper {
+	
+	/**
+	 * 查询符合条件的用户列表
+	 * @return
+	 */
+	public List<User> selectUser(PageBean page);
+	
+	/**
+	 * 获取用户总条数	
+	 * @return
+	 */
+	public int selectUserCount(SerchParam params);
+	
+	/**
+	 * 获取符合条件所有消息
+	 * @return 所有的消息
+	 */
+	public List<Message> selectMessageRecoreds(PageBean page);
+	
+	/**
+	 * 修改一条消息		
+	 * @return 影响的行数
+	 */
+	public int updateMessage(Message message);
+	
+	/**
+	 * 添加一条消息		
+	 * @return 影响的行数
+	 */
+	public int insertMessage(Message message);
+	
+	
+
+	/**
+	 * 获取所有消息的总条数
+	 * @return 所有的消息条数
+	 */
+	public int selectMessageCount(SerchParam params);
+	
+	/**
+	 * 获取系统的所有消息(user为空的)
+	 * @param recordId 用户id
+	 * @return 用户的所有消息
+	 */
+	public List<Message> selectSysMessageRecoreds();
+	
+	/**
+	 * 根据信息id获取信息实体类			
+	 * @param id 信息id
+	 * @return 信息实体类
+	 */
+	public Message selectUserMessageByid(Long id);
+	
+	/**
+	 * 根据用户id获取该用户的所有消息		
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectUserMessageRecoreds(Long userid);
+	
+	
+	/**
+	 * 获取某状态的用户消息			
+	 * @param userid 用户id 
+	 * @param isread 1已读,2 未读
+	 * @return 用户消息集合
+	 */
+	public int selectUserMessageByisread(Long userid,Long isread);
+
+}

+ 258 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/MilkMapper.java

@@ -0,0 +1,258 @@
+package com.iamberry.app.mapper;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectKey;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.entity.MilkDatetimeValue;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.sqlprovider.DMLProvider;
+
+public interface MilkMapper {
+
+	/**
+	 * 添加信息到milk_making_record表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkMakingRecord(MilkMakingRecord entity);
+
+	/**
+	 * 根据id修改MILK_MAKING_RECORD的start和comments属性
+	 *
+	 * @param stars
+	 * @param comments
+	 * @param id
+	 */
+	public void updateMilkMakingRecord(int stars, String comments, Long id);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param userId
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, Long userId, String devId);
+
+	/**
+	 * 查询冲奶机冲奶时间和冲奶量
+	 *
+	 * @param start
+	 * @param end
+	 * @param controller
+	 * @param dateType
+	 * @param formatter
+	 * @param devids
+	 * @return
+	 */
+	public List<Map<String, Object>> selectMachineMilkMakingRecords(Date start, Date end,
+			String controller, String dateType,
+			String formatter, String devids);
+
+	/**
+	 * 根据id查询MILK_MAKING_RECORD所有信息
+	 *
+	 * @author Moon Cheng
+	 * @param id
+	 * @return
+	 */
+	public MilkMakingRecord selectMilkMakingRecord(Long id);
+
+	/**
+	 * 根据user查询所有冲奶信息
+	 *
+	 * @author Moon Cheng
+	 * @param user
+	 * @return
+	 */
+	public List<MilkMakingRecord> getMilkPowderByUser(Long user);
+	
+	
+	
+	/**
+	 * 根据user查询总冲奶量和次数
+	 * @param user
+	 * @return
+	 */
+	public RecordCountInfoDTO getMilkPowderSumByUser(Long user);
+	
+	/**
+	 * 将奶粉信息插入到奶粉信息表中
+	 *
+	 * @param entity
+	 * @return void
+	 */
+	public void insertMilkPowderInfo(MilkPowderInfo entity);
+
+	/**
+	 * 通过条形码查询奶粉信息
+	 *
+	 * @author Moon Cheng
+	 * @param barCode
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkPowderInfo(String barcode);
+
+	/**
+	 * 根据品牌查询奶粉信息的系列
+	 *
+	 * @param brand
+	 * @return
+	 */
+	public List<String> selectSeries(String brand);
+
+	/**
+	 * 根据系列查询奶粉信息的段数
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectLevel(String series);
+
+	
+	/**
+	 * 根据奶粉品牌获取奶粉,详细信息
+	 * @param brand 奶粉品牌
+	 * @return 详细信息
+	 */
+	public List<MilkInfoDTO> selectMilkInfoBybrand(String brand);
+	
+	
+	/**
+	 * 根据系列查询奶粉信息
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<MilkInfoDTO> selectMilkInfo( String series);
+
+	
+
+	/**
+	 * 根据系列查询奶粉类型
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkType(String series);
+
+	/**
+	 * 根据奶粉系列查询奶粉密度
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkDensity(String series);
+
+	/**
+	 * 根据系列查询奶粉比例
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkRatio(String series);
+
+	/**
+	 * 根据系列查询奶粉id
+	 *
+	 * @param series
+	 * @return
+	 */
+	public List<Long> selectMilkId(String series);
+
+	/**
+	 * 根据系列查询奶粉的重量
+	 * @param series
+	 * @return
+	 */
+	public List<String> selectMilkWeightPerSpoon(String series);
+
+	/**
+	 * 查询奶粉品牌
+	 *
+	 * @return
+	 */
+	public List<String> selectMilkPowderBrand();
+
+	/**
+	 * 根据系列段数品牌获取奶粉信息
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo selectMilkInfoByBrandSeriesLevel(String brand, String series, String level);
+
+	/**
+	 * 查询冲奶记录的冲奶时间
+	 *
+	 * @return
+	 */
+	public Date selectLastRecordDate();
+
+	/**
+	 * 将信息插入到冲奶记录表中
+	 *
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void insertRecordData(MilkMakingRecord milkMakingRecord);
+
+	/**
+	 * 根据用户id查询冲奶机机器码
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public List<String> getMyMachines(Long userId);
+
+	/**
+	 * milk_images表中添加数据
+	 * @param entity
+	 */
+	public void insertMilkImages(MilkImages entity);
+	
+	/**
+	 * 根据时间、机器号,获取数据
+	 * @param mac
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public List<MilkDatetimeValue> getMilkRecordByTime(@Param("mac") String mac, @Param("start") Date startDate, @Param("end") Date endDate);
+	
+	/**
+	 * 根据日期统计数据
+	 * @param mac
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public List<MilkDatetimeValue> getMilkRecordByDate(@Param("year")boolean isYear, @Param("mac") String mac, @Param("start") Date startDate, @Param("end") Date endDate);
+}

+ 161 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/UserMapper.java

@@ -0,0 +1,161 @@
+package com.iamberry.app.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.iamberry.app.core.entity.User;
+
+/**
+ *
+ * @author Moon Cheng
+ * @date 2016年1月16日 下午12:25:05
+ */
+public interface UserMapper {
+
+	// ================================================================================================
+	// ------------------------------------------User----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 根据id查询user所有信息
+	 *
+	 * @param id
+	 * @return User Information
+	 */
+	public User selectUserById(Long id);
+
+	/**
+	 * 根据username查询user所有信息
+	 *
+	 * @param username
+	 * @return User Information
+	 */
+	public User selectUserByUsername(String username);
+
+	/**
+	 * 通过ext_open_id查询user所有信息
+	 *
+	 * @param extOpenId
+	 * @return User Information
+	 */
+	public User selectUserByExtOpenId(String extOpenId);
+
+	/**
+	 * 添加用户信息到user表中
+	 *
+	 * @param user
+	 */
+	public void insertUser(User user);
+
+	/**
+	 * 根据id修改user表数据
+	 *
+	 * @param user
+	 */
+	public int updateUser(User user);
+
+	/**
+	 * 根据id修改user表的个人头像
+	 *
+	 * @author Moon Cheng
+	 * @param image
+	 * @param id
+	 */
+	public int updateDisplayPicture(String imageUrl, Long id);
+
+	/**
+	 * 根据用户名和密码查询用户表信息
+	 *
+	 * @param username
+	 * @param password
+	 * @return User Information
+	 */
+	public User validateUser(String username, String password);
+
+	/**
+	 * 通过id修改用户表密码
+	 *
+	 * @param id
+	 * @param newPassword
+	 * @return update row count
+	 */
+	public int changePassword(Long id, String newPassword);
+
+	// ================================================================================================
+	// ------------------------------------------UserToken----------------------------------------------
+	// ================================================================================================
+	/**
+	 * 通过token查询user表所有信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public User selectUserByToken(String token);
+
+	/**
+	 * 根据id修改token值
+	 *
+	 * @param token
+	 * @param userId
+	 * @return int
+	 */
+	public int updateUserToken(String token, Long userId);
+
+	/**
+	 * 根据id修改user表的用户名
+	 *
+	 * @author Moon Cheng
+	 * @param username
+	 * @param userId
+	 * @return
+	 */
+	public int updateUserName(String username, Long userId);
+
+	/**
+	 * 通过key_查询sys_config表数据
+	 *
+	 * @param key
+	 * @return String
+	 */
+	public String selectConfig(String key);
+
+	// ================================================================================================
+	// ------------------------------------------UserAvator----------------------------------------------
+	// ================================================================================================
+	/**
+	 * USER_AVATOR表中添加数据
+	 *
+	 * @param id
+	 * @param avator
+	 *            void
+	 */
+	public void insertUserAvator(Long id, String avator);
+
+	/**
+	 * 通过user_id修改USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @param avator
+	 * @return int
+	 */
+	public int updateUserAvator(Long id, String avator);
+
+	/**
+	 * 根据user_id查询USER_AVATOR表数据
+	 *
+	 * @param id
+	 * @return String
+	 */
+	public String selectUserAvator(Long id);
+	
+	@Deprecated
+	public java.util.List<User> getAll(@Param("start") int start, @Param("end") int end);
+
+	/**
+	 * 根据手机号码,获取用户信息,但是排除指定的用户ID
+	 * @param phone
+	 * @param userId
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月21日
+	 */
+	public User getOtherUserByTel(@Param("phone") String phone, @Param("userId") Integer userId);
+}

+ 59 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/codeMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.CodeMapper">
+	
+	<!-- 保存一个发送记录 -->
+	<insert id="save" parameterType="CodeValid">
+		INSERT INTO
+			CODE_VALID
+				(
+					CODE_PHONE, CODE_VALUE, CODE_SEND_DATE, CODE_VALID_DATE, 
+					CODE_STATUS, CODE_MSG, CODE_CHANNEL, CODE_USE, CODE_SCENARIO
+				)
+		VALUES
+			(
+				#{codePhone}, #{codeValue}, #{codeSendDate}, #{codeValidDate}, 
+				#{codeStatus}, #{codeMsg}, #{codeChannel}, #{codeUse}, #{codeScenario}
+			)
+	</insert>
+	
+	<!-- 获取用户最近的记录 -->
+	<select id="getLast" parameterType="string" resultType="CodeValid">
+		SELECT 
+			*
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		ORDER BY 
+			CODE_ID DESC
+		LIMIT 0, 1
+	</select>
+	
+	<!-- 根据code_id,更新本次记录状态 -->
+	<update id="update" parameterType="long">
+		UPDATE 
+			CODE_VALID 
+		SET 
+			CODE_USE = 1
+		WHERE 
+			CODE_ID = #{codeID}
+	</update>
+	
+	<!-- 检查当前手机号码发送的次数 -->
+	<select id="getInterval" parameterType="java.util.Map" resultType="int">
+		<![CDATA[
+		SELECT 
+			count(code_id)
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		AND
+			CODE_SEND_DATE >= #{startDate}
+		AND
+			CODE_SEND_DATE <= #{enDate}
+		]]>
+	</select>
+</mapper>

+ 17 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/logMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.LogMapper">
+	
+	<insert id="insertSysLog" parameterType="SysLog">
+		INSERT INTO
+			SYS_LOG
+				(
+					LOG_TYPE, OPERATION, DETAIL, TIMESTAMP_
+				)
+		VALUES
+			(
+				#{log_type}, #{operation}, #{detail}, #{timestamp_}
+			)
+	</insert>
+</mapper>

+ 124 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/machineMapper.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MachineMapper">
+	<sql id="allMachineField">
+		ID,
+		OWNER,
+		MACHINE_NAME,
+		MACHINE_MAC,
+		MACHINE_INFO,
+		STATUS_,
+		LOCATION,
+		CREATED_ON
+	</sql>
+	
+	<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
+    <resultMap type="Machine" id="machineMap">
+        <!-- 用id属性来映射主键字段 -->
+        <id property="id" column="id"/>
+        <!-- 用result属性来映射非主键字段 -->
+        <result property="owner" column="owner"/>
+        <result property="machine_name" column="machine_name"/>
+        <result property="machine_mac" column="machine_mac"/>
+        <result property="machine_info" column="machine_info"/>
+        <result property="status_" column="status_"/>
+        <result property="location" column="location"/>
+        <result property="created_on" column="created_on"/>
+    </resultMap>
+    
+    
+	<!-- 添加一台机器 -->
+	<insert id="insertMachine" parameterType="Machine"
+		useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MACHINE 
+			(MACHINE_NAME,MACHINE_MAC,MACHINE_INFO,OWNER,STATUS_,LOCATION,CREATED_ON)
+		VALUES
+			(
+				#{machine_name},#{machine_mac},#{machine_info},#{owner}
+				,#{status_},#{location},#{created_on}
+			)
+	</insert>
+
+	<!-- 根据id 修改一台机器信息  -->
+	<update id="updateMachine" parameterType="Machine">
+		UPDATE MACHINE
+		<set>
+			<if test="owner != null and owner != ''">
+				OWNER=#{owner},
+			</if>
+			<if test="machine_name != null and machine_name != ''">
+				MACHINE_NAME=#{machine_name},
+			</if>
+			<if test="machine_mac != null and machine_mac != ''">
+				MACHINE_MAC=#{machine_mac},
+			</if>
+			<if test="machine_info != null and machine_info != ''">
+				MACHINE_INFO=#{machine_info},
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_=#{status_},
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION=#{location},
+			</if>
+			<if test="created_on != null and created_on != ''">
+				CREATED_ON=#{created_on},
+			</if>
+		</set>
+		WHERE ID=#{id}
+	</update>
+	
+	<!-- 根据id 修改一台机器的状态-->
+	<update id="updateMachineStatus" parameterType="Machine">
+		UPDATE MACHINE 
+		SET STATUS_ = #{0},CREATED_ON = NOW() 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 根据机器码 修改一台机器的状态-->
+	<update id="updateStatusByMac">
+		UPDATE MACHINE 
+		SET STATUS_ = #{1},CREATED_ON = NOW() 
+		WHERE machine_mac = #{0}
+	</update>
+	
+	<!-- 根据id 修改一台机器的位置信息-->
+	<update id="updateMachineLocation" parameterType="Machine">
+		UPDATE MACHINE 
+		SET LOCATION = #{0} 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 按用户,查询所有机器 -->
+	<select id="selectMachineByOwner" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE OWNER = #{owner}
+	</select>
+	
+	<!-- 根据id 查询一台机器 -->
+	<select id="selectMachineById" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE ID = #{id}
+	</select>
+	
+	<!-- 根据机器码和所属用户 查一台机器id -->
+	<select id="isDevUserPairExist" resultType="Long">
+		SELECT ID
+		FROM MACHINE WHERE  MACHINE_MAC = #{0} AND OWNER = #{1}
+	</select>
+	
+	<!-- 根据机器的ID,查询最近的一个用户ID -->
+	<select id="selectUserIDByDevId" parameterType="String" resultType="Long">
+		SELECT OWNER 
+		FROM MACHINE 
+		WHERE MACHINE_MAC = #{devid} ORDER BY id DESC LIMIT 0, 1
+	</select>
+</mapper>

+ 209 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/messageMapper.xml

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MessageMapper">
+	<sql id="messageAllField">
+		ID,TITLE, CONTENT,URL,
+		FORWORD,IS_NEEDSEND,IS_READ,
+		CREATE_DATE,READ_DATE,SEND_TYPE,
+		USER,REMARK,SEND_RESULT
+	</sql>
+	<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
+    <resultMap type="Message" id="messageMap">
+        <id property="id" column="ID"/>
+        <result property="title" column="TITLE"/>
+        <result property="content" column="CONTENT"/>
+        <result property="url" column="URL"/>
+        <result property="forword" column="FORWORD"/>
+        <result property="is_needsend" column="IS_NEEDSEND"/>
+        
+        <result property="is_read" column="IS_READ"/>
+        <result property="create_date" column="CREATE_DATE"/>
+        <result property="read_date" column="READ_DATE"/>
+        <result property="send_type" column="SEND_TYPE"/>
+        <result property="user" column="USER"/>
+        <result property="remark" column="REMARK"/>
+        <result property="send_result" column="SEND_RESULT"/>
+    </resultMap>
+    
+	<sql id="userAttribute">
+		ID,
+		USERNAME,
+		PASSWORD,
+		TOKEN,
+		DISPLAY_NAME,
+		DISPLAY_PICTURE,
+		CREATED_ON,
+		EXT_OPEN_ID,
+		EXT_NAME,
+		EXT_TYPE,
+		LOCATION,
+		BABY_NICKNAME,
+		BABY_DOB,
+		BABY_GENDER,
+		STATUS_ 
+	</sql>
+	
+	<!-- 查询符合条件的用户列表 -->
+	<select id="selectUser" parameterType="PageBean" resultType="User">
+		SELECT 
+			<include refid="userAttribute"></include>
+		FROM USER
+		WHERE 1=1
+	    <if test="params.username!=null and params.username!=''" >
+			AND USERNAME LIKE CONCAT('%',#{params.username},'%')
+	    </if>
+		<if test='recordBegin>0 and pageSize>0'>
+			limit ${recordBegin},${pageSize}
+	    </if>
+	    <if test='recordBegin==0 and pageSize>0 '>
+			limit ${pageSize}
+	    </if> 
+	</select>
+	
+	<!-- 获取用户总条数 -->
+	<select id="selectUserCount" parameterType="SerchParam" resultType="int">
+		SELECT COUNT(ID) FROM USER WHERE 1=1 
+	 	<if test="username!=null and username!=''">
+    		AND USERNAME LIKE CONCAT('%',#{username},'%')
+    	</if>
+	</select>
+	
+	<!-- 获取符合条件所有消息 -->
+	<select id="selectMessageRecoreds" parameterType="PageBean" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM (
+			SELECT ID,TITLE, CONTENT,URL,FORWORD,IS_NEEDSEND,IS_READ,CREATE_DATE,READ_DATE,SEND_TYPE,
+			(SELECT USERNAME FROM USER WHERE ID = a.user) USER,REMARK,SEND_RESULT  FROM MESSAGE a 
+		) a
+    	WHERE 1=1
+    	<if test="params.title!=null and params.title!=''" >
+			AND TITLE LIKE CONCAT('%',#{params.title},'%') 
+    	</if>
+		<if test="params.username!=null and params.username!=''">
+			AND USER LIKE CONCAT('%',#{params.username},'%') 
+		</if>
+		<if test="params.beginDate!= null and  params.beginDate!= ''" >
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') >= DATE_FORMAT(#{params.beginDate},'%Y-%m-%d')]]>
+		</if>
+		<if test="params.endDate!= null and params.endDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') <= DATE_FORMAT(#{params.endDate},'%Y-%m-%d')]]>
+    	</if>
+		ORDER BY CREATE_DATE DESC,USER 
+	    <if test='recordBegin>0 and pageSize>0'>
+			LIMIT ${recordBegin},${pageSize}
+	    </if>
+	    <if test='recordBegin==0 and pageSize>0 '>
+			LIMIT ${pageSize}
+	    </if>
+	</select>
+	
+	<!-- 获取所有消息的总条数 -->
+	<select id="selectMessageCount" parameterType="SerchParam" resultType="int">
+		SELECT COUNT(1) FROM MESSAGE
+		WHERE 1=1
+	    <if test="title!=null and title!=''">
+			AND TITLE LIKE CONCAT('%',#{title},'%') 
+	    </if>
+	    <if test="beginDate!= null and  beginDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') >= DATE_FORMAT(#{beginDate},'%Y-%m-%d')]]>
+	    </if>
+	    <if test="endDate!= null and endDate!= ''">
+			<![CDATA[AND DATE_FORMAT(create_date, '%Y-%m-%d') <= DATE_FORMAT(#{endDate},'%Y-%m-%d')]]>
+	    </if>
+	</select>
+	
+	<!-- 根据id 修改一条消息 -->
+	<update id="updateMessage" parameterType="Message">
+		UPDATE MESSAGE 
+		<set>
+			<if test="title != null and title != ''">
+				TITLE=#{title},
+			</if>
+			<if test="content != null and content != ''">
+				CONTENT=#{content},
+			</if>
+			<if test="url != null and url != ''">
+				URL=#{url},
+			</if>
+			<if test="forword != null and forword != ''">
+				FORWORD=#{forword},
+			</if>
+			<if test="is_needsend != null and is_needsend != ''">
+				IS_NEEDSEND=#{is_needsend},
+			</if>
+			<if test="is_read != null and is_read != ''">
+				IS_READ=#{is_read},
+			</if>
+			<if test="create_date != null and create_date != ''">
+				CREATE_DATE=#{create_date},
+			</if>
+			<if test="read_date != null and read_date != ''">
+				READ_DATE=#{read_date},
+			</if>
+			<if test="send_type != null and send_type != ''">
+				SEND_TYPE=#{send_type},
+			</if>
+			<if test="user != null and user != ''">
+				USER=#{user},
+			</if>
+			<if test="remark != null and remark != ''">
+				REMARK=#{remark},
+			</if>
+			<if test="send_result != null and send_result != ''">
+				SEND_RESULT=#{send_result}
+			</if>
+		</set>
+		WHERE ID=#{id}
+	</update>
+	
+	<!-- 添加一条消息 -->
+	<insert id="insertMessage" parameterType="Message"
+		useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MESSAGE
+			(
+				TITLE, CONTENT,URL, FORWORD,IS_NEEDSEND,IS_READ,
+				CREATE_DATE,READ_DATE,SEND_TYPE, USER,REMARK,SEND_RESULT
+			)
+		VALUES
+			(
+				#{title},#{content},#{url},#{forword},#{is_needsend},#{is_read},
+				#{create_date},#{read_date},#{send_type},#{user},
+				#{remark},#{send_result}
+			)
+	</insert>
+	
+	<!-- 获取系统的所有消息 -->
+	<select id="selectSysMessageRecoreds" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM MESSAGE 
+		WHERE USER IS NULL 
+		ORDER BY CREATE_DATE DESC
+	</select>
+	
+	<!-- 根据id获取一条信息  -->
+	<select id="selectUserMessageByid" parameterType="Long" resultMap="messageMap">
+		SELECT 
+			<include refid="messageAllField"></include>
+		FROM MESSAGE WHERE ID = #{id}
+	</select>
+	
+	<!-- 根据用户id获取该用户的所有消息 -->
+	<select id="selectUserMessageRecoreds" parameterType="Long" resultMap="messageMap">
+		SELECT
+			<include refid="messageAllField"></include>
+		FROM MESSAGE WHERE USER=#{userid}  ORDER BY CREATE_DATE DESC
+	</select>
+	
+	<!--  获取某状态的用户消息 -->
+	<select id="selectUserMessageByisread" resultType="int">
+		SELECT COUNT(1)  FROM message where is_read = #{1} and user=#{0}	
+	</select>
+</mapper>

+ 315 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/milkMapper.xml

@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MilkMapper">
+
+	<sql id="milkAttribute">
+		id,
+		volume,
+		controller,
+		stars,
+		comments,
+		brand,
+		powder_info,
+		machine_name,
+		machine,
+		user,
+		timestamp_
+	</sql>
+	
+	<sql id="powderAttribute">
+		id,
+		powder_number,
+		spoon_picture,
+		bar_code,
+		brand,
+		series,
+		level,
+		version_,
+		age_range,
+		weight_per_spoon,
+		milk_volume_per_spoon,
+		powder_ratio,
+		density,
+		type,
+		status_,
+		created_on
+	</sql>
+	
+	<resultMap type="MilkMakingRecord" id="milkMap">
+		<id property="id" column="id"/>
+		<result property="volume" column="volume"/>
+		<result property="controller" column="controller"/>
+		<result property="stars" column="stars"/>
+		<result property="comments" column="comments"/>
+		<result property="brand" column="brand"/>
+		<result property="powder_info" column="powder_info"/>
+		<result property="machine_name" column="machine_name"/>
+		<result property="machine" column="machine"/>
+		<result property="user" column="user"/>
+		<result property="timestamp_" column="timestamp_"/>
+	</resultMap>
+	
+	<resultMap type="MilkPowderInfo" id="powderMap">
+		<id property="id" column="id"/>
+		<result property="powder_number" column="powder_number"/>
+		<result property="spoon_picture" column="spoon_picture"/>
+		<result property="bar_code" column="bar_code"/>
+		<result property="brand" column="brand"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="version_" column="version_"/>
+		<result property="age_range" column="age_range"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+		<result property="milk_volume_per_spoon" column="milk_volume_per_spoon"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="density" column="density"/>
+		<result property="type" column="type"/>
+		<result property="status_" column="status_"/>
+		<result property="created_on" column="created_on"/>
+	</resultMap>
+	
+	<resultMap type="com.iamberry.app.core.dto.MilkInfoDTO" id="milkInfoDtoMap">
+		<id property="id" column="id"/>
+		<result property="series" column="series"/>
+		<result property="level" column="level"/>
+		<result property="type" column="type"/>
+		<result property="powder_ratio" column="powder_ratio"/>
+		<result property="weight_per_spoon" column="weight_per_spoon"/>
+	</resultMap>
+	
+	<!-- 添加信息到milk_making_record表中 -->
+	<insert id="insertMilkMakingRecord" parameterType="MilkMakingRecord" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_MAKING_RECORD
+		(VOLUME,CONTROLLER,STARS,COMMENTS,BRAND,POWDER_INFO,MACHINE_NAME,MACHINE,USER,TIMESTAMP_) 
+		VALUES
+		(#{volume},#{controller},#{stars},#{comments},#{brand},#{powder_info},#{machine_name},#{machine},#{user},NOW())
+	</insert>
+	
+	<!-- 根据id修改MILK_MAKING_RECORD的start和comments属性 -->
+	<update id="updateMilkMakingRecord">
+		UPDATE MILK_MAKING_RECORD SET STARS = #{0}, COMMENTS = #{1} WHERE ID = #{2}
+	</update>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			user = #{5} 
+		AND 
+			machine = #{6} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 查询冲奶机冲奶时间和冲奶量 -->
+	<select id="selectMachineMilkMakingRecords" resultType="java.util.HashMap">
+		SELECT 
+			DATE_FORMAT(timestamp_, #{4}) AS #{3}, 
+			SUM(volume) AS volume 
+		FROM 
+			milk_making_record 
+		WHERE 
+			<![CDATA[timestamp_ >= #{0}]]> 
+		AND 
+			<![CDATA[timestamp_ <= #{1}]]> 
+		AND 
+			controller = #{2} 
+		AND 
+			machine = #{5} 
+		GROUP BY #{3}
+	</select>
+	
+	<!-- 根据id查询MILK_MAKING_RECORD所有信息 -->
+	<select id="selectMilkMakingRecord" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据user查询所有冲奶信息 -->
+	<select id="getMilkPowderByUser" parameterType="java.lang.Long" resultMap="milkMap">
+		SELECT <include refid="milkAttribute" /> FROM MILK_MAKING_RECORD WHERE USER = #{0}
+	</select>
+	
+	<!-- 根据user查询总冲奶量和次数 -->
+	<select id="getMilkPowderSumByUser" parameterType="java.lang.Long" resultType="com.iamberry.app.core.dto.RecordCountInfoDTO">
+		SELECT COUNT(1) count,SUM(VOLUME) total FROM MILK_MAKING_RECORD WHERE USER = #{0} 
+	</select>
+	
+	<!-- 将奶粉信息插入到奶粉信息表中 -->
+	<insert id="insertMilkPowderInfo" parameterType="MilkPowderInfo" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MILK_POWDER_INFO
+			(POWDER_NUMBER,SPOON_PICTURE,BAR_CODE,BRAND,SERIES,LEVEL,VERSION_,AGE_RANGE,
+			WEIGHT_PER_SPOON,MILK_VOLUME_PER_SPOON,POWDER_RATIO,DENSITY,TYPE,STATUS_,CREATED_ON) 
+		VALUES
+			(#{powder_number},#{spoon_picture},#{bar_code},#{brand},#{series},#{level},#{version_},#{age_range},#{weight_per_spoon},
+			#{milk_volume_per_spoon},#{powder_ratio},#{density},#{type},#{status_},NOW())
+	</insert>
+	
+	<!-- 通过条形码查询奶粉信息 -->
+	<select id="selectMilkPowderInfo" parameterType="java.lang.String" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BAR_CODE = #{0}  and status_='approved' 
+	</select>
+	
+	<!-- 根据品牌查询奶粉信息的系列 -->
+	<select id="selectSeries" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT 
+			series 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{brand} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息的段数 -->
+	<select id="selectLevel" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT level FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC 
+	</select>
+	
+	<!-- 根据奶粉品牌获取奶粉,详细信息 -->
+	<select id="selectMilkInfoBybrand" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			series,
+			level,
+			type,
+			id,
+			powder_ratio,
+			weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			BRAND LIKE #{0} 
+		AND 
+			UPPER(STATUS_) = 'APPROVED' 
+		ORDER BY CONVERT(SERIES USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉信息 -->
+	<select id="selectMilkInfo" parameterType="java.lang.String" resultMap="milkInfoDtoMap">
+		SELECT 
+			level,type,id,powder_ratio,weight_per_spoon 
+		FROM 
+			MILK_POWDER_INFO 
+		WHERE 
+			SERIES LIKE #{0} 
+		ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉类型 -->
+	<select id="selectMilkType" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT type FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据奶粉系列查询奶粉密度 -->
+	<select id="selectMilkDensity" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT density FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉比例 -->
+	<select id="selectMilkRatio" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT powder_ratio FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉id -->
+	<select id="selectMilkId" parameterType="java.lang.String" resultType="java.lang.Long">
+		SELECT id FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 根据系列查询奶粉的重量 -->
+	<select id="selectMilkWeightPerSpoon" parameterType="java.lang.String" resultType="java.lang.String">
+		SELECT weight_per_spoon FROM MILK_POWDER_INFO WHERE SERIES LIKE #{0} ORDER BY CONVERT(LEVEL USING GBK) ASC
+	</select>
+	
+	<!-- 查询奶粉品牌 -->
+	<select id="selectMilkPowderBrand" resultType="java.lang.String">
+		SELECT brand FROM MILK_POWDER_INFO WHERE STATUS_ = 'approved' GROUP BY BRAND
+	</select>
+	
+	<!-- 根据系列段数品牌获取奶粉信息 -->
+	<select id="selectMilkInfoByBrandSeriesLevel" resultMap="powderMap">
+		SELECT <include refid="powderAttribute" /> FROM MILK_POWDER_INFO WHERE BRAND = #{0} AND SERIES = #{1} AND LEVEL = #{2} 
+	</select>
+	
+	<!-- 查询冲奶记录的冲奶时间 -->
+	<select id="selectLastRecordDate" resultType="java.util.Date">
+		SELECT timestamp_ FROM MILK_MAKING_RECORD WHERE CONTROLLER = 'machine' ORDER BY ID DESC LIMIT 1 
+	</select>
+	
+	<!-- 根据用户id查询冲奶机机器码 -->
+	<select id="getMyMachines" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT machine_mac FROM MACHINE WHERE OWNER = #{0}
+	</select>
+	
+	<!-- 将信息插入到冲奶记录表中 -->
+	<insert id="insertRecordData" parameterType="MilkMakingRecord">
+		INSERT INTO milk_making_record (volume, controller, machine, timestamp_, user) VALUE (#{volume}, 'machine', #{machine}, #{timestamp_}, #{user})
+	</insert>
+	
+	<!-- milk_images表中添加数据 -->
+	<insert id="insertMilkImages" parameterType="MilkImages" useGeneratedKeys="true" keyProperty="image_id">
+		INSERT INTO MILK_IMAGES
+		(
+			IMAGE_MILK_ID,IMAGE_FRONT,IMAGE_BAR,IMAGE_FEED
+		) 
+		VALUES 
+		(
+			#{image_Milk_ID},#{image_Front},#{image_Bar},#{image_Feed}
+		)
+	</insert>
+	
+	<!-- 获取某一天的冲奶记录 -->
+	<select id="getMilkRecordByTime" parameterType="java.util.Map" resultType="com.iamberry.app.core.entity.MilkDatetimeValue">
+		<![CDATA[
+		SELECT
+			VOLUME value,
+			DATE_FORMAT(TIMESTAMP_, '%T') dateTime
+		FROM
+			MILK_MAKING_RECORD
+		WHERE
+			MACHINE = #{mac}
+		AND TIMESTAMP_ >= #{start}
+		AND TIMESTAMP_ <= #{end}
+		]]>
+	</select>
+	
+	
+	<!-- 获取某一月/年的冲奶记录 -->
+	<select id="getMilkRecordByDate" parameterType="java.util.Map" resultType="com.iamberry.app.core.entity.MilkDatetimeValue">
+		SELECT
+			SUM(VOLUME) value,
+		<choose>
+			<when test="year == true">
+				DATE_FORMAT(TIMESTAMP_, '%Y-%m') dateTime
+			</when>
+			<otherwise>
+				DATE_FORMAT(TIMESTAMP_, '%Y-%m-%d') dateTime
+			</otherwise>
+		</choose>
+		FROM
+			MILK_MAKING_RECORD
+		WHERE
+			MACHINE = #{mac}
+		AND TIMESTAMP_ >= #{start}
+		<![CDATA[
+		AND TIMESTAMP_ <= #{end}
+		]]>
+		GROUP BY
+			dateTime
+	</select>
+</mapper>

+ 206 - 0
iamberry-app-service/src/main/java/com/iamberry/app/mapper/userMapper.xml

@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.UserMapper">
+
+	<sql id="userAttribute">
+		id,
+		username,
+		password,
+		token,
+		display_name,
+		display_picture,
+		created_on,
+		ext_open_id,
+		ext_name,
+		ext_type,
+		location,
+		baby_nickname,
+		baby_dob,
+		baby_gender,
+		status_ ,
+		user_tel userTel
+	</sql>
+	
+	<resultMap type="User" id="userMap">
+		<id property="id" column="id"/>
+		<result property="username" column="username"/>
+		<result property="password" column="password"/>
+		<result property="token" column="token"/>
+		<result property="display_name" column="display_name"/>
+		<result property="display_picture" column="display_picture"/>
+		<result property="created_on" column="created_on"/>
+		<result property="ext_open_id" column="ext_open_id"/>
+		<result property="ext_name" column="ext_name"/>
+		<result property="ext_type" column="ext_type"/>
+		<result property="location" column="location"/>
+		<result property="baby_nickname" column="baby_nickname"/>
+		<result property="baby_dob" column="baby_dob"/>
+		<result property="baby_gender" column="baby_gender"/>
+		<result property="status_" column="status_"/>
+		<result property="userTel" column="user_tel"/>
+	</resultMap>
+	
+	<!-- 根据id查询user所有信息 -->
+	<select id="selectUserById" parameterType="java.lang.Long" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute" />
+		FROM USER WHERE ID = #{0}
+	</select>
+	
+	<!-- 根据username查询user所有信息 -->
+	<select id="selectUserByUsername" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE USERNAME = #{0}
+	</select>
+	
+	<!-- 通过ext_open_id查询user所有信息 -->
+	<select id="selectUserByExtOpenId" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute" /> FROM USER WHERE EXT_OPEN_ID = #{0}
+	</select>
+	
+	<!-- 添加用户信息到user表中 -->
+	<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO USER 
+			(
+				USERNAME,PASSWORD,TOKEN,DISPLAY_NAME,DISPLAY_PICTURE,
+				CREATED_ON,EXT_OPEN_ID,EXT_NAME,EXT_TYPE,
+				LOCATION,BABY_NICKNAME,BABY_DOB,BABY_GENDER,STATUS_,USER_TEL) 
+		VALUES 
+			(
+				#{username},#{password},#{token},#{display_name},#{display_picture},
+				NOW(),#{ext_open_id},#{ext_name},#{ext_type},
+				#{location},#{baby_nickname},#{baby_dob},#{baby_gender},#{status_}, #{userTel}
+			)
+	</insert>
+	
+	<!-- 根据id修改user表数据 -->
+	<update id="updateUser" parameterType="User">
+		UPDATE USER 
+		<set>
+			<if test="username != null and username != ''">
+				USERNAME = #{username}, 
+			</if>
+			<if test="password != null and password != ''">
+				PASSWORD = #{password}, 
+			</if>
+			<if test="token != null and token != ''">
+				TOKEN = #{token}, 
+			</if>
+			<if test="display_name != null and display_name != ''">
+				DISPLAY_NAME = #{display_name}, 
+			</if>
+			<if test="display_picture != null and display_picture != ''">
+				DISPLAY_PICTURE = #{display_picture}, 
+			</if>
+			<if test="ext_open_id != null and ext_open_id != ''">
+				EXT_OPEN_ID = #{ext_open_id}, 
+			</if>
+			<if test="ext_name != null and ext_name != ''">
+				EXT_NAME = #{ext_name}, 
+			</if>
+			<if test="ext_type != null and ext_type != ''">
+				EXT_TYPE = #{ext_type}, 
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION = #{location}, 
+			</if>
+			<if test="baby_nickname != null and baby_nickname != ''">
+				BABY_NICKNAME = #{baby_nickname}, 
+			</if>
+			<if test="baby_dob != null and baby_dob != ''">
+				BABY_DOB = #{baby_dob}, 
+			</if>
+			<if test="baby_gender != null and baby_gender != ''">
+				BABY_GENDER = #{baby_gender}, 
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_ = #{status_},
+			</if>
+			<if test="userTel != null and userTel != ''">
+				USER_TEL = #{userTel} 
+			</if>
+		</set>
+		WHERE 
+			ID = #{id} 
+	</update>
+	
+	<!-- 根据id修改user表的个人头像 -->
+	<update id="updateDisplayPicture">
+		UPDATE USER SET DISPLAY_PICTURE = #{0} WHERE ID = #{1} 
+	</update>
+	
+	<!-- 根据用户名和密码查询用户表信息 -->
+	<select id="validateUser" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE USERNAME=#{0} AND PASSWORD=#{1} 
+	</select>
+	
+	<!-- 通过id修改用户表密码 -->
+	<update id="changePassword">
+		UPDATE USER SET PASSWORD=#{1} WHERE ID=#{0}
+	</update>
+	
+	<!-- 通过token查询user表所有信息 -->
+	<select id="selectUserByToken" parameterType="java.lang.String" resultMap="userMap">
+		SELECT <include refid="userAttribute"/> FROM USER WHERE TOKEN=#{0} 
+	</select>
+	
+	<!-- 根据id修改token值 -->
+	<update id="updateUserToken">
+		UPDATE USER SET TOKEN=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 根据id修改user表的用户名 -->
+	<update id="updateUserName">
+		UPDATE USER SET USERNAME=#{0} WHERE ID=#{1}
+	</update>
+	
+	<!-- 通过key_查询sys_config表数据 -->
+	<select id="selectConfig" parameterType="java.lang.String" resultType="String">
+		SELECT VALUE_ FROM SYS_CONFIG WHERE KEY_ = #{0}
+	</select>
+	
+	<!-- USER_AVATOR表中添加数据 -->
+	<insert id="insertUserAvator">
+		INSERT INTO USER_AVATOR (USER_ID, AVATOR) VALUE (#{0}, #{1})
+	</insert>
+	
+	<!-- 通过user_id修改USER_AVATOR表数据 -->
+	<update id="updateUserAvator">
+		UPDATE USER_AVATOR SET AVATOR = #{1} WHERE USER_ID = #{0}
+	</update>
+	
+	<!-- 根据user_id查询USER_AVATOR表数据 -->
+	<select id="selectUserAvator" parameterType="java.lang.Long" resultType="java.lang.String">
+		SELECT avator FROM USER_AVATOR WHERE USER_ID = #{id}
+	</select>
+	
+	<!-- 根据user_id查询USER_AVATOR表数据 -->
+	<select id="getOtherUserByTel" parameterType="java.util.Map" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute"/> 
+		FROM 
+			USER 
+		WHERE 
+			USER_TEL = #{phone} 
+				AND 
+			ID != #{userId} 
+				AND 
+			STATUS_ = 'ACTIVE' 
+		LIMIT 
+			0, 1
+	</select>
+	
+	<select id="getAll" parameterType="java.util.Map" resultMap="userMap">
+		SELECT 
+			<include refid="userAttribute"/> 
+		FROM 
+			USER
+		LIMIT
+			#{start}, #{end}
+	</select>
+</mapper>

+ 63 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/BaseService.java

@@ -0,0 +1,63 @@
+package com.iamberry.app.service;
+
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.jpush.api.JPushClient;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.mapper.LogMapper;
+import com.iamberry.app.mapper.MachineMapper;
+import com.iamberry.app.mapper.MessageMapper;
+import com.iamberry.app.mapper.MilkMapper;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+
+@Service
+public class BaseService {
+
+	@Autowired
+	protected UserMapper userMapper;
+	@Autowired
+	protected MachineMapper machineMapper;
+	@Autowired
+	protected MilkMapper milkMapper;
+	@Autowired
+	protected LogMapper logMapper;
+	@Autowired
+	protected MessageMapper messageMapper;
+
+	protected static final ObjectMapper mapper = new ObjectMapper();
+
+	public static JPushClient jpushClient = new JPushClient(ImberryConfig.MASTERSECRET, ImberryConfig.APPKEY);
+
+	protected static final int PAGE_SIZE = 10;
+
+	protected String getEncToken(long userId) {
+		return WebJsonTokenUtil.getToken(Integer.parseInt(userId+""));
+//		String tokenKey = Utility.getRandomString(10);
+//		String base64 = userId + "|" + tokenKey + "|" + System.currentTimeMillis();
+//		return new String(Base64.encodeBase64(base64.getBytes()));
+	}
+
+	public User validateUserToken(String token) {
+		
+		Map<String, Object> map = WebJsonTokenUtil.verifier(token);
+		if ("1".equals(map.get("status").toString())) {
+			// 失败
+			return null;
+		}
+		// 根据id,获取数据
+		User userInfo = userMapper.selectUserById(Long.parseLong(map.get("userid").toString()));
+		if (userInfo == null) {
+			return null;
+		}
+		return userInfo;
+	}
+}

+ 332 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/CodeServiceImpl.java

@@ -0,0 +1,332 @@
+package com.iamberry.app.service;
+
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_KEY;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.INTER_SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Response;
+import com.iamberry.app.config.ResponseHeader;
+import com.iamberry.app.core.entity.CodeValid;
+import com.iamberry.app.face.CodeService;
+import com.iamberry.app.mapper.CodeMapper;
+import com.iamberry.app.tool.util.Result;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.ResponseJson;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+/**
+ * @company	深圳爱贝源科技有限公司
+ * @website www.iamberry.com
+ * @author 	献
+ * @tel		18271840547
+ * @date	2016年11月1日
+ * @explain	验证码业务实现类
+ */
+@Service
+public class CodeServiceImpl implements CodeService {
+
+	@Autowired
+	private CodeMapper codeMapper;
+	
+	private static Logger log = LoggerFactory.getLogger(CodeServiceImpl.class);
+	private static String ENCODING = "UTF-8";
+
+	@Override
+	public ResponseJson sendCode(String phone, int codeScenario) {
+		// TODO Auto-generated method stub
+		// 第一步,判断使用通道,如果是+86开头,优先使用国内通道,否则默认使用国外通道
+		ResponseJson json = new ResponseJson();
+		if (StringUtils.isEmpty(phone)) {
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Phone Empty!");
+			return json;
+		}
+		
+		// 第二步,如果是国内,判断是否存在
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		 
+		// 通道是否是中国的
+		boolean IS_CHANNEL_ZH = true;
+		if (StringUtils.indexOf(phone, "+") != -1) {
+			if (StringUtils.startsWith(phone, "+86")) {
+				IS_CHANNEL_ZH = true;
+			}
+		} else {
+			IS_CHANNEL_ZH = true;
+		}
+		// 判断通道
+		if (IS_CHANNEL_ZH && codeValid != null) {
+			// ** 切换通道需求:每次请求验证码,如果上一次验证码在一分钟以后,三分钟以内没有使用,那么切换通道 **//
+			if (now.getTime() <= (codeValid.getCodeValidDate().getTime()) && 
+					(now.getTime() - 60000) >= codeValid.getCodeSendDate().getTime() && codeValid.getCodeUse() == 2 && codeValid.getCodeScenario() == codeScenario) {
+				// 如果等待三分钟后,那么切换通道,暂时不切换
+//				IS_CHANNEL_ZH = false;
+			}
+		}
+		// 获取验证码
+		String code = Utility.getRandomCode(4);
+		json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		if (json.getReturnCode() != 200) {
+			json = sendCMS(phone, code, IS_CHANNEL_ZH ? 1 : 2);
+		}
+		// 保存发送记录
+		codeValid = new CodeValid();
+		codeValid.setCodeChannel(IS_CHANNEL_ZH ? 1 : 2);
+		codeValid.setCodeMsg(json.getReturnMsg().get("returnMsg").toString());
+		codeValid.setCodePhone(phone);
+		codeValid.setCodeScenario(codeScenario);
+		codeValid.setCodeSendDate(now);
+		codeValid.setCodeValidDate(new Date(now.getTime() + 180000));
+		codeValid.setCodeStatus(json.getReturnCode() == 200 ? 3 : 4);
+		codeValid.setCodeUse(2);
+		codeValid.setCodeValue(Integer.parseInt(code));
+		codeMapper.save(codeValid);
+		return json;
+	}
+	
+	/**
+	 * @param phone		手机号码
+	 * @param code		短信验证码
+	 * @param channel	通道 1:主通道;2:备用通道(国外的电话通通使用此)
+	 * @return
+	 */
+	private ResponseJson sendCMS(String phone, String code, int channel) {
+		
+		log.info("【发送短信】 Tel:" + phone + " ------> code(" + code + "), channel:" + channel);
+		
+		// 国内号码
+		ResponseJson json = new ResponseJson();
+		json.setReturnCode(500);
+		String result = null;
+		try {
+			if (channel == 1) {
+				// 使用主通道
+//				result = sendZHCMS(phone, code);
+				result = sendOtherCMS(phone, code);
+			} else {
+				// 使用备用通道
+				result = sendOtherCMS(phone, code);
+			}
+		} catch (Exception e) {
+			result = e.getMessage();
+		}
+		if (StringUtils.equals(result, "SUCCESS")) {
+			json.setReturnCode(200);
+		}
+		json.addResponseKeyValue(result);
+		return json;
+	}
+	
+	private String sendOtherCMS(String phone, String code) {
+		String text = MessageFormat.format(INTER_SMS_TEXT, code);
+		String results = sendSms(text, phone);
+        JSONObject json =  JSONObject.fromObject(results);
+        String resultcod  = json.get("code").toString();
+        if(resultcod.equals("0")){
+        	System.out.println("使用备用通道,发送验证码成功!" + code);
+        	return "SUCCESS";
+        }else{
+        	System.out.println("使用备用通道,发送失败...!" + code);
+        	return results;
+        }
+		
+	}
+
+	public static String sendSms(String text, String mobile)  {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", INTER_SMS_KEY);
+        params.put("text", text);
+        params.put("mobile", mobile);
+        return post(INTER_SMS_URL, params);
+    }
+
+	 /** 基于HttpClient 4.3的通用POST方法
+    * @param url       提交的URL
+    * @param paramsMap 提交<参数,值>Map
+    * @return 提交响应
+    */
+    public static String post(String url, Map<String, String> paramsMap) {
+    	
+        CloseableHttpClient client = HttpClients.createDefault();
+        String responseText = "";
+        CloseableHttpResponse response = null;
+            try {
+                HttpPost method = new HttpPost(url);
+                if (paramsMap != null) {
+                    List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+                    for (Map.Entry<String, String> param : paramsMap.entrySet()) {
+                        NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+                        paramList.add(pair);
+                    }
+                    method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
+                }
+                response = client.execute(method);
+                HttpEntity entity = response.getEntity();
+                if (entity != null) {
+                    responseText = EntityUtils.toString(entity);
+                }
+                
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    response.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            return responseText;
+        }
+
+	private String sendZHCMS(String phone, String code) throws Exception {
+
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phone);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close(); 
+			if (0 == object.getResultcode()) {
+				return "SUCCESS";
+			} else {
+				return object.getResultcode() + ":" + object.getErrordescription();
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public ResponseJson validCode(String phone, String code, int codeScenario) {
+		ResponseJson json = new ResponseJson();
+		// 校验
+		CodeValid codeValid = codeMapper.getLast(phone);
+		if (codeValid == null) {
+			// 操作有误
+			json.setReturnCode(404);
+			json.addResponseKeyValue("Wrong operation, No send record");
+			return json;
+		}
+		Date now = new Date();
+		if (now.getTime() > codeValid.getCodeValidDate().getTime()) {
+			// 验证码无效
+			json.setReturnCode(403);
+			json.addResponseKeyValue("Verification code is invalid");
+			return json;
+		}
+		// 验证码是否使用 1:已经使用;2:未使用
+		if (codeValid.getCodeUse().intValue() == 1) {
+			// 验证码无效
+			json.setReturnCode(402);
+			json.addResponseKeyValue("Verification code has been used");
+			return json;
+		}
+		// 必须 验证码正确,并且场景正确
+		if (!(codeValid.getCodeValue() == (Integer.parseInt(code)) 
+				&& codeScenario == codeValid.getCodeScenario())) {
+			// 验证码错误
+			json.setReturnCode(405);
+			json.addResponseKeyValue("Verification code error");
+			return json;
+		}
+		// 只要校验成功,表示本次验证码已使用
+		codeMapper.update(codeValid.getCodeId());
+		json.setReturnCode(200);
+		json.addResponseKeyValue("SUCCESS");
+		return json;
+	}
+	
+	/**
+	 * 放轰炸原则:
+	 * 	1、每个手机号码,每60秒只能发送1次!
+	 * 	2、每个手机号码,每小时只能发送三次!
+	 *  3、每个手机号码,每天只能发送10次!
+	 * @param phone
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月5日
+	 */
+	public Response interval(String phone) {
+		CodeValid codeValid = codeMapper.getLast(phone);
+		Date now = new Date();
+		
+		// 每个手机号,限制每60秒,只能发送一次
+		if (codeValid != null && (60000 > (now.getTime() - codeValid.getCodeSendDate().getTime()))) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每60秒只能发送1次!", 0));
+		}
+		
+		// 如果上一次的验证码没有使用,那么需要输入验证码
+		if (codeValid != null && codeValid.getCodeUse() == 2) {
+			return new Response(new ResponseHeader(403, "请输入验证码", 0));
+		}
+		
+		// 生成时间规则
+		Date startDate = new Date();
+		startDate.setMinutes(0);
+		startDate.setSeconds(0);
+		Date endDate = new Date();
+		endDate.setMinutes(59);
+		endDate.setSeconds(60);
+		
+		// 每个手机号码,每个小时最多3条
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 3) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每小时只能发送3次!", 0));
+		}
+		
+		// 每个手机号码,每天最多10条
+		endDate.setHours(23);
+		startDate.setHours(0);
+		if (codeMapper.getInterval(startDate, endDate, phone) >= 10) {
+			return new Response(new ResponseHeader(404, "每个手机号码,每天只能发送10次!", 0));
+		}
+		return new Response(new ResponseHeader(200, "SUCCESS", 0));
+	}
+	
+}

+ 28 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/LogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.iamberry.app.service;
+
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.core.entity.SysLog;
+import com.iamberry.app.face.LogService;
+
+/**
+ * LogService
+ * 
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午2:34:45
+ */
+@Service
+public class LogServiceImpl extends BaseService implements LogService  {
+
+	/**
+	 * saveSystemLog
+	 * 
+	 * @author Moon Cheng
+	 * @param log
+	 * @return
+	 */
+	public SysLog saveSystemLog(SysLog log) {
+		logMapper.insertSysLog(log);
+		return log;
+	}
+}

+ 173 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/MachineServiceImpl.java

@@ -0,0 +1,173 @@
+package com.iamberry.app.service;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.http.ParseException;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.entity.Machine;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.MachineService;
+import com.iamberry.app.tool.util.HttpUtility;
+
+/**
+ * MachineService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午12:27:32
+ */
+@Service
+public class MachineServiceImpl extends BaseService implements MachineService {
+
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+	
+	/**
+	 * setMachine
+	 * @author Moon Cheng
+	 * @param machine
+	 * @param token
+	 * @return Machine Information
+	 */
+	@Transactional
+	public Machine setMachine(Machine machine, String token, String ip) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+
+		String location = null;
+		try {
+			location = new JSONObject(
+					HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL,ip)))
+							.getString("city");
+		} catch (ParseException | IOException | JSONException e) {
+			e.printStackTrace();
+		}
+		machine.setLocation(location);
+
+		machine.setOwner(userInfo.getId());
+		Long machineId = machineMapper.isDevUserPairExist(machine.getMachine_mac(), userInfo.getId());
+		machine.setCreated_on(new Date());
+		if (machineId == null) {
+			machineMapper.insertMachine(machine);
+		} else {
+			machine.setId(machineId);
+			machineMapper.updateMachine(machine);
+		}
+		return machine;
+	}
+
+	/**
+	 * updateMachineStatus
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param status
+	 * @param token
+	 * @return
+	 */
+	public int updateMachineStatus(Long machineId, String status, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		return machineMapper.updateMachineStatus(status, machineId);
+	}
+
+	/**
+	 * updateMachineLocation
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param location
+	 * @param token
+	 * @return
+	 */
+	public int updateMachineLocation(Long machineId, String location, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		return machineMapper.updateMachineLocation(location, machineId);
+	}
+
+	/**
+	 * 	按用户,查询所有机器
+	 * @param owner
+	 * @param token
+	 * @return
+	 */
+	public List<Machine> searchMachineByOwner(Long owner, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		List<Machine> machines = machineMapper.selectMachineByOwner(owner);
+		return machines;
+	}
+
+	/**
+	 * searchMachineById
+	 *
+	 * @author Moon Cheng
+	 * @param machineId
+	 * @param token
+	 * @return
+	 */
+	public Machine searchMachineById(Long machineId, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		Machine machine = machineMapper.selectMachineById(machineId);
+		return machine;
+	}
+
+	/**
+	 * updateStatus
+	 *
+	 * @param status
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional
+	public void updateStatus(String status) {
+		// the method is expensive!
+		Map<String, Object> map = new HashMap<>();
+		try {
+			map = mapper.readValue(status,new HashMap<String, Object>().getClass());
+			
+		} catch (IOException e) {
+			logger.error(e.getMessage());
+			e.printStackTrace();
+		}
+		for (Entry<String, Object> entry : map.entrySet()) {
+			if (entry.getValue() instanceof String) {
+				machineMapper.updateStatusByMac(entry.getKey(),  entry.getValue().equals("0") ? "online" : "offline");
+			} else {
+				machineMapper.updateStatusByMac(entry.getKey(),  (Integer)entry.getValue() == 0 ? "online" : "offline");
+			}
+		}
+	}
+
+	@Override
+	public Long selectUserIDByDevId(String devId) {
+		// TODO Auto-generated method stub
+		return machineMapper.selectUserIDByDevId(devId);
+	}
+}

+ 132 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/MessageServiceImpl.java

@@ -0,0 +1,132 @@
+package com.iamberry.app.service;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.core.entity.Message;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.core.serch.SerchParam;
+import com.iamberry.app.face.MessageService;
+import com.iamberry.wechat.core.entity.PageBean;
+
+/**
+ * LogService
+ * 
+ * @author Moon Cheng
+ * @date 2016年3月23日 下午2:34:45
+ */
+@Service
+public class MessageServiceImpl extends BaseService implements MessageService  {
+
+	/**
+	 * 查询符合条件的用户列表
+	 * @return
+	 */
+	public List<User> selectUser(PageBean page){
+		page.initRecordBegin();
+		return messageMapper.selectUser(page);
+	}
+	
+	/**
+	 * 获取用户总条数
+	 * @return
+	 */
+	public int selectUserCount(SerchParam params){
+		return messageMapper.selectUserCount(params);
+	}
+
+	
+	/**
+	 * 修改一条消息
+	 * @return 影响的行数
+	 */
+	public int updateMessage(Message message){
+		return messageMapper.updateMessage(message);
+	}
+	
+	/**
+	 * 添加一条消息
+	 * @return 影响的行数
+	 */
+	public int insertMessage(Message message){
+		message.setCreate_date(new Date());//添加时间
+		message.setIs_read(Long.valueOf("2"));//未读
+		return messageMapper.insertMessage(message);
+	}
+	
+	/**
+	 * 获取符合条件所有消息的总条数
+	 * @return 所有的消息条数
+	 */
+	public int selectMessageCount(SerchParam params){
+		return messageMapper.selectMessageCount(params);
+	}
+	
+	/**
+	 * 获取符合条件所有消息
+	 * @return 所有的消息
+	 */
+	public List<Message> selectMessageRecoreds(PageBean page){
+		page.initRecordBegin();
+		return messageMapper.selectMessageRecoreds(page);
+	}
+
+	
+	/**
+	 * 获取系统的所有消息
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectSysMessageRecoreds(){
+		return messageMapper.selectSysMessageRecoreds();
+	}
+	
+	/**
+	 * 根据信息id获取信息实体类
+	 * @param id 信息id
+	 * @return 信息实体类
+	 */
+	public Message selectUserMessageByid(Long id){
+		Message message = messageMapper.selectUserMessageByid(id);
+		if (message == null) {
+			return null;
+		}
+		//修改为已读
+		message.setRead_date(new Date());
+		message.setIs_read(Long.valueOf("1"));
+		messageMapper.updateMessage(message);
+		return message;
+	}
+	
+	/**
+	 * 根据用户id获取该用户的所有消息
+	 * @param userid 用户id
+	 * @return 用户下所有的消息
+	 */
+	public List<Message> selectUserMessageRecoreds(String token){
+		
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		return messageMapper.selectUserMessageRecoreds(userInfo.getId());
+	}
+	
+	/**
+	 * 获取用户消息
+	 * @param userid 用户id 
+	 * @param isread 1已读,2 未读
+	 * @return 用户消息集合
+	 */
+	public int selectUserMessageByisread(String token,
+			 Long isread){
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+		
+		return messageMapper.selectUserMessageByisread(userInfo.getId(),isread);
+	}
+}

+ 466 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/MilkServiceImpl.java

@@ -0,0 +1,466 @@
+package com.iamberry.app.service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.math.NumberUtils;
+import org.joda.time.DateTime;
+import org.springframework.stereotype.Service;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.core.dto.MilkInfoDTO;
+import com.iamberry.app.core.dto.RecordCountInfoDTO;
+import com.iamberry.app.core.dto.RecordDTO;
+import com.iamberry.app.core.entity.MilkDatetimeValue;
+import com.iamberry.app.core.entity.MilkImages;
+import com.iamberry.app.core.entity.MilkMakingRecord;
+import com.iamberry.app.core.entity.MilkPowderInfo;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.MilkService;
+import com.iamberry.app.ulitity.Utility;
+import com.iamberry.wechat.tools.DateTimeUtil;
+
+/**
+ * MilkService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:10
+ */
+@Service
+public class MilkServiceImpl extends BaseService implements MilkService {
+
+	/**
+	 * setMilkMakingRecord
+	 * @param makingRecord
+	 * @param token
+	 * @param recordId
+	 * @return
+	 */
+	public MilkMakingRecord setMilkMakingRecord(MilkMakingRecord makingRecord, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		makingRecord.setUser(userInfo.getId());
+		makingRecord.setTimestamp_(new Date());
+		milkMapper.insertMilkMakingRecord(makingRecord);
+		return makingRecord;
+	}
+
+	/**
+	 * searchUserRecordsBytime
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @param startTime
+	 * @param endTime
+	 * @return Milk Making Record List
+	 */
+	public Map<String, List<RecordDTO>> searchUserRecordsByTime(Long userId, String dateStatus, String chosenDate,
+			String machineMac) {
+
+		Map<String, List<RecordDTO>> recordInfos = new LinkedHashMap<String, List<RecordDTO>>();
+		String dateType = null, formatter = null;
+		Calendar calendar = Calendar.getInstance();
+		if (chosenDate != null) {
+			// calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd
+			// HH:mm:ss", chosenDate));
+			// 防止无数据时显示分钟错误
+			chosenDate = chosenDate.substring(0, chosenDate.length() - 6) + ":00:00";
+			calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+		} else {
+			calendar.setTime(new Date());
+		}
+		Date start = null, end = null;
+		switch (dateStatus) {
+		case "day":
+			dateType = "days";
+			formatter = "%Y%m%d%H";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "week":
+			dateType = "weeks";
+			formatter = "%Y%m%d";
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 0, 0,
+					0);
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONDAY), calendar.get(Calendar.DATE), 23,
+					59, 59);
+			if (Calendar.SUNDAY < Calendar.MONDAY) {
+				calendar.add(Calendar.DATE, 7);
+			}
+			calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		case "year":
+			dateType = "years";
+			formatter = "%Y%m";
+			calendar.set(calendar.get(Calendar.YEAR), 0, 1, 0, 0, 0);
+			start = calendar.getTime();
+			calendar.set(calendar.get(Calendar.YEAR), 11, 31, 23, 59, 59);
+			end = calendar.getTime();
+			recordInfos.put("app", Utility.convertMap(
+					milkMapper.selectMilkMakingRecords(start, end, "app", dateType, formatter, userId, machineMac),
+					dateType));
+			recordInfos.put("machine", Utility.convertMap(
+					milkMapper.selectMachineMilkMakingRecords(start, end, "machine", dateType, formatter, machineMac),
+					dateType));
+			break;
+		}
+		return Utility.fillAppMachineRecordWithZero(Utility.synAppMachineRecord(recordInfos), dateType, chosenDate);
+	}
+
+	/**
+	 * searchUserRecordById
+	 *
+	 * @author Moon Cheng
+	 * @param recordId
+	 * @return Milk Making Record Information
+	 */
+	public MilkMakingRecord searchUserRecordById(Long recordId) {
+		MilkMakingRecord makingRecord = milkMapper.selectMilkMakingRecord(recordId);
+		return makingRecord;
+	}
+
+	/**
+	 * 根据用户,获取冲奶记录的-->总量和次数
+	 *
+	 * @author Moon Cheng
+	 * @param userId
+	 * @return
+	 */
+	public RecordCountInfoDTO getTotalMilkVolumeMadeByUser(Long userId) {
+		RecordCountInfoDTO recordcount = milkMapper.getMilkPowderSumByUser(userId);
+		return  recordcount;
+	}
+
+	/**
+	 * setMilkPowderInfo
+	 *
+	 * @author Moon Cheng
+	 * @param entity
+	 * @param token
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo setMilkPowderInfo(MilkPowderInfo entity, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		// change status as user's phone number
+		entity.setStatus_(
+				userInfo.getUsername().length() > 11 ? Constants.MILK_POWDER_NOT_APPROVED : userInfo.getUsername());
+		entity.setCreated_on(new Date());
+		milkMapper.insertMilkPowderInfo(entity);
+		return entity;
+	}
+
+	/**
+	 * searchMilkPowderInfoByBarCode
+	 *
+	 * @author Moon Cheng
+	 * @param barcode
+	 * @return Milk Powder Information
+	 */
+	public MilkPowderInfo searchMilkPowderInfoByBarCode(String barcode) {
+		MilkPowderInfo milkPowderInfo = milkMapper.selectMilkPowderInfo(barcode);
+		return milkPowderInfo;
+	}
+
+	/**
+	 * 
+	 * 通过品牌名获取奶粉信息
+	 * @author Moon Cheng, Yin
+	 * @param brand
+	 * @return Milk Powder List
+	 */
+	public Map<String, List<String>> searchMilkPowderInfosByBrand(String brand) {
+		brand = "%" + brand.trim() + "%";
+		Map<String, List<String>> infos = new IdentityHashMap<String, List<String>>();
+		List<MilkInfoDTO> milkInfo = milkMapper.selectMilkInfoBybrand(brand);
+		for (int i = 0; i < milkInfo.size(); i++) {
+			List<String> list = new LinkedList<String>();
+			list.add(milkInfo.get(i).getLevel() + ":" + milkInfo.get(i).getType() + ":"
+					+ milkInfo.get(i).getPowder_ratio() + ":" + milkInfo.get(i).getId() + ":"
+					+ milkInfo.get(i).getWeight_per_spoon());
+			infos.put(milkInfo.get(i).getSeries(),list);
+		}
+		
+		return infos;
+	}
+
+	/**
+	 * searchMilkPowderBrand
+	 *
+	 * @return Brand List
+	 */
+	public List<String> searchMilkPowderBrand() {
+		List<String> milkPowderInfos = milkMapper.selectMilkPowderBrand();
+		List<String> result = new ArrayList<>();
+		milkPowderInfos.forEach(milk -> {
+			if (NumberUtils.isNumber(milk) && milk.contains(".")) {
+				milk = milk.substring(0, milk.indexOf("."));
+			}
+			result.add(milk);
+		});
+		return result;
+	}
+
+	/**
+	 * searchMilkInfoByBrandSeriesLevel
+	 *
+	 * @param brand
+	 * @param series
+	 * @param level
+	 * @return
+	 */
+	public MilkPowderInfo searchMilkInfoByBrandSeriesLevel(String brand, String series, String level) {
+		return milkMapper.selectMilkInfoByBrandSeriesLevel(brand, series, level);
+	}
+
+	// =====================================TuyaHistoryData======================================
+	/**
+	 * getLastRecordDate
+	 *
+	 * @return
+	 */
+	public Date getLastRecordDate() {
+		Date lastDate = milkMapper.selectLastRecordDate();
+		return lastDate == null ? new Date() : lastDate;
+	}
+
+	/**
+	 * addRecordData
+	 * @param devId
+	 * @param value
+	 * @param time
+	 */
+	public void addRecordData(String devId, String value, Long time, Long userId) {
+		MilkMakingRecord milkMakingRecord = new MilkMakingRecord();
+		milkMakingRecord.setVolume(Integer.parseInt(value));
+		milkMakingRecord.setMachine(devId);
+		milkMakingRecord.setTimestamp_(new Date(time));
+		milkMakingRecord.setUser(userId);
+		milkMapper.insertRecordData(milkMakingRecord);
+	}
+
+	@Override
+	public void setMilkImages(MilkImages images) {
+		// TODO Auto-generated method stub
+		milkMapper.insertMilkImages(images);
+	}
+
+	/*@Override
+	public List<MilkDatetimeValue> getMilkRecordByTime(String mac, String date) {
+		// TODO Auto-generated method stub
+		
+		// 处理搜索的时间
+		date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM-dd"));
+		
+		// 获取时间区间
+		Date startDate = DateTimeUtil.parse(date, "yyyy-MM-dd");
+		
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(startDate);
+		calendar.set(Calendar.HOUR_OF_DAY, 24);
+		
+		// 获取
+		List<MilkDatetimeValue> list = milkMapper.getMilkRecordByTime(mac, startDate, calendar.getTime());
+		return list;
+	}
+
+	@Override
+	public List<MilkDatetimeValue> getMilkRecordByDate(String mac, String date) {
+		
+		// 处理搜索的时间
+		date = (date != null ? date : DateTimeUtil.format(new Date(), "yyyy-MM"));
+		
+		// 判断统计单位:年份或者是月
+		boolean isYear = false;
+		if (date.indexOf("-") == -1) {
+			isYear = true;
+		}
+		
+		// year =  true 表示统计年份,false : 表示统计月
+		final boolean year = isYear;
+		
+		// 返回的数据格式
+		String dateFormat = year ? "yyyy-MM" : "yyyy-MM-dd";
+		
+		// 获取时间区间
+		Date startDate = year ? DateTimeUtil.parse(date, "yyyy") : DateTimeUtil.parse(date, "yyyy-MM");
+		Date endDate = getLastDayOfYear(startDate, year);
+		
+		// 查询数据
+		List<MilkDatetimeValue> values = milkMapper.getMilkRecordByDate(year, mac, startDate, endDate);
+		
+		// 如果为空需要填充数据到8条
+		if (values == null || values.size() <= 0) {
+			values = new ArrayList<MilkDatetimeValue>();
+			Date tempDate = startDate;
+			for (int i = 0; i < 8; i++) {
+				values.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
+				tempDate = getDate(tempDate, year);
+			}
+			return values;
+		}
+		
+		// 创建返回对象
+		List<MilkDatetimeValue> returnValues = new ArrayList<MilkDatetimeValue>(year ? 12 : 31);
+		
+		// 当前已经填充的时间
+		Date paddDate = null;
+		
+		for (int i = 0; i < values.size(); i++) {
+			
+			// 获取当前迭代的数据,如果为空,那么跳过
+			MilkDatetimeValue milkDatetimeValue = values.get(i);
+			if (milkDatetimeValue == null || milkDatetimeValue.getDateTime() == null) {
+				continue;
+			}
+			
+			// 获取当前时间
+			Date temp = DateTimeUtil.parse(milkDatetimeValue.getDateTime(), dateFormat);
+			
+			// 填充
+			paddDate = padding(temp, returnValues, year, paddDate, milkDatetimeValue);
+		}
+		
+		// 保证返回数据为8条,可能还需要填充
+		if (returnValues.size() <= 8) {
+			int count = 8 - returnValues.size();
+			Date tempDate = DateTimeUtil.parse(returnValues.get(returnValues.size() - 1).getDateTime(), dateFormat);
+			for (int i = 0; i < count; i++) {
+				tempDate = getAddDate(tempDate, year);
+				returnValues.add(new MilkDatetimeValue(DateTimeUtil.format(tempDate, dateFormat), 0));
+			}
+		}
+		
+		// 返回
+		return returnValues;
+	}*/
+	
+	/**
+	 * 填充数据方法
+	 * @param dateYear
+	 * @param values
+	 * @param isYear
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public static Date padding(Date dateYear, List<MilkDatetimeValue> values, final boolean isYear, Date paddDate, MilkDatetimeValue milkDatetimeValue) {
+		
+		// 填充的原则是,如果已经填充过的时间为空,表示可以填充;
+		// 如果需要填充的时间大于已经填充的时间,表示可以填充
+		if (paddDate == null || dateYear.getTime() > paddDate.getTime()) {
+			// next
+			Date nextDate = getUpDate(dateYear, isYear);
+			if (nextDate != null) {
+				padding(nextDate, values, isYear, paddDate, null);
+			}
+			
+			// add Data
+			MilkDatetimeValue datetimeValue = new MilkDatetimeValue();
+			datetimeValue.setDateTime(DateTimeUtil.format(dateYear, isYear ? "yyyy-MM" : "yyyy-MM-dd"));
+			datetimeValue.setValue(milkDatetimeValue == null ? 0 : milkDatetimeValue.getValue());
+			values.add(datetimeValue);
+			
+			// 替换已经填充过的时间
+			paddDate = dateYear;
+		}
+		return paddDate;
+	}
+	
+	/**
+	 * 根据当前时间,获取上一个记录的时间
+	 * @param date
+	 * @param isYear
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+	public static Date getUpDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	// 如果当前月份为1月,那么,不需要处理啦,应该跳过
+        	if (cal.get(Calendar.MONTH) == 0) {
+        		return null;
+        	}
+        	cal.add(Calendar.MONTH, -1);
+        } else {
+        	// 如果当前天为1日,那么,不需要处理啦,应该跳过
+        	if (cal.get(Calendar.DAY_OF_MONTH) <= 1) {
+        		return null;
+        	}
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+        }
+		return cal.getTime();
+	}
+	
+	public static Date getDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	cal.add(Calendar.MONTH, -1);
+        } else {
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+        }
+		return cal.getTime();
+	}
+	
+	public static Date getAddDate(Date date, final boolean isYear) {
+		Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (isYear) {
+        	cal.add(Calendar.MONTH, +1);
+        } else {
+            cal.add(Calendar.DAY_OF_MONTH, +1);
+        }
+		return cal.getTime();
+	}
+
+	/**
+	 * 根据一个数据获取对应的结束时间,如果是年,获取本年最后一个月的最后一天
+	 * @param date
+	 * @param year
+	 * @return
+	 * @author 献
+	 * @Time   2016年12月12日
+	 */
+    public static Date getLastDayOfYear(Date date, boolean year) {
+    	Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, 24);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        if (year) {
+        	cal.set(Calendar.MONTH, cal.getActualMaximum(Calendar.MONTH));
+        }
+        return cal.getTime();
+    }
+}

+ 422 - 0
iamberry-app-service/src/main/java/com/iamberry/app/service/UserServiceImpl.java

@@ -0,0 +1,422 @@
+package com.iamberry.app.service;
+
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.config.ImberryConfig;
+import com.iamberry.app.core.dto.RemoteIpInfoDTO;
+import com.iamberry.app.core.dto.UserDTO;
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.tool.util.AES;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.MD5;
+import com.iamberry.app.tool.util.TuyaConnector;
+import com.iamberry.app.tool.util.WebJsonTokenUtil;
+import com.iamberry.app.ulitity.Utility;
+/**
+ * UserService
+ *
+ * @author Moon Cheng
+ * @date 2016年3月23日 上午11:33:29
+ */
+@Service
+public class UserServiceImpl extends BaseService implements UserService {
+	
+	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+
+	/**
+	 * register
+	 *
+	 * @author Moon Cheng
+	 * @param phone 电话号码
+	 * @param password 密码
+	 * @param ip ip地址
+	 * @return User Information
+	 */
+	@Transactional
+	public User register(String phone, String password, String ip) {
+		// 创建用户,填充数据
+		User user = new User(phone, MD5.md5(password), new Date(), Constants.USER_SAVE_TEL);
+		user.setUserTel(phone);															// 完善手机号码
+		String defaultName = phone.substring(0, 3) + "****" + phone.substring(7, 11);	// 默认的昵称
+		user.setDisplay_name(defaultName);
+		user.setStatus_(Constants.USER_SAVE_TEL);										// 当前用户的状态为已完善手机号码,待完善宝宝信息
+		user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1")); 		// 设置宝宝生日
+		RemoteIpInfoDTO dto = getLocation(ip);
+		if (dto != null) {
+			try {
+				user.setLocation(dto.getCity());
+			} catch (Exception e) {
+				user.setLocation("深圳");
+			}
+		}
+		
+		// 在此,生成用户的保存区间,保证系统调用成功,通过手机号hash 定位当前区间
+//		int interval = phone.hashCode() % 10;
+		
+		user.setCreated_on(new Date());													// 创建时间为当前时间
+		userMapper.insertUser(user);
+		
+		if (user.getId() == null) {
+			return null;
+		}
+
+		// 生成token
+		String token = getEncToken(user.getId());
+		user.setToken(token);
+		user.setPassword(null);
+		
+		// 返回数据
+		return user;
+	}
+
+	/**
+	 * thirdPartBindingPhone
+	 * @param phone
+	 * @param openId
+	 * @return
+	 */
+	public User thirdPartBindingPhone(String phone, String openId) {
+		// 判断用户是否存在
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			return null;
+		}
+		// 用户已经完善手机号码,不需要完善
+		if (!user.getStatus_().equals(Constants.USER_NOW_INIT)) {
+			return null;
+		}
+		
+		// 根据手机号码,完善信息
+		User db = new User();
+		db.setUserTel(phone);
+		db.setStatus_(Constants.USER_SAVE_TEL);
+		db.setId(user.getId());
+		
+		// 判断手机号码是否存在账户信息,如果有,需要copy
+		User tempUser = userMapper.getOtherUserByTel(phone, user.getId().intValue());
+		if (tempUser != null) {
+			// 需要copy信息
+			db.setBaby_dob(tempUser.getBaby_dob());
+			db.setBaby_gender(tempUser.getBaby_gender());
+			db.setBaby_nickname(tempUser.getBaby_nickname());
+			db.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 执行修改
+		int status = userMapper.updateUser(db);
+		if (status > 0) {
+			user.setUsername(phone);
+			user.setPassword(null);
+		} else {
+			return null;
+		}
+		
+		user.setStatus_(db.getStatus_());
+		return user;
+	}
+
+	/**
+	 * findById
+	 * @param id
+	 * @return User
+	 */
+	public User findById(Long id) {
+		User user = userMapper.selectUserById(id);
+		user.setPassword(null);
+		return user;
+	}
+
+	/**
+	 * login
+	 *
+	 * @param phone
+	 * @param password
+	 * @param userAgent
+	 * @return
+	 */
+	public Object login(String phone, String password) {
+		User user = userMapper.selectUserByUsername(phone);
+		if (user == null) {
+			return -1;
+		}
+		if (!MD5.md5(password).equals(user.getPassword())) {
+			return -2;
+		}
+		if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 待完善宝宝信息
+			user.setIs_perfect_user(2);
+		}
+		// 生成token
+		String token = getEncToken(user.getId());
+		// 将手机号码 -----> username
+		user.setUsername(user.getUserTel());
+		user.setToken(token);
+		user.setPassword(null);
+		// 注册涂鸦
+		UserDTO dto = tuyaConnect(user);
+		if (Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			dto.setIs_perfect_user(1);
+		} else if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
+			// 需要完善宝宝信息
+			dto.setIs_perfect_user(2);
+		} else {
+			// 注册完成
+			dto.setIs_perfect_user(3);
+		}
+		return dto;
+	}
+
+	/**
+	 * thirdPartLogin
+	 *
+	 * @param openId
+	 * @param extType
+	 * @param extName
+	 * @param extPicture
+	 * @return
+	 */
+	public User thirdPartLogin(String openId, String extType, String extName, String extPicture, String ip) {
+		User user = userMapper.selectUserByUsername(openId);
+		if (user == null) {
+			// 不存在,则自动注册,如果是第三方登录的用户,默认为刚初始化,需要完善手机号码、宝宝信息,账户才能正常使用
+			user = new User(openId, MD5.md5(Constants.TUYA_DEFAULT_PASS), new Date(), Constants.USER_NOW_INIT);
+			user.setExt_open_id(openId);
+			user.setExt_type(extType);
+			user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1"));
+			user.setDisplay_name(extName.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"));
+			user.setUserTel("");	// 手机号码默认为空
+
+			RemoteIpInfoDTO dto = getLocation(ip);
+			if (dto != null) {
+				user.setLocation(dto.getCity());
+			} else {
+				user.setLocation("默认");
+			}
+
+			user.setDisplay_picture(extPicture);
+			userMapper.insertUser(user);
+		}
+		// 获取token
+		user.setToken(WebJsonTokenUtil.getToken(user.getId().intValue()));
+		user.setPassword(null);
+		if (!Constants.USER_NOW_INIT.equals(user.getStatus_())) {
+			// 需要完善手机号码
+			user.setUsername(user.getUserTel());
+		}
+		
+		return user;
+	}
+
+	/**
+	 * updateUserInfo
+	 *
+	 * @param user
+	 * @param token
+	 * @return
+	 */
+	public User updateUserInfo(User user, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		/*if (!userInfo.getStatus_().equals(Constants.USER_SAVE_TEL)) {
+			return null;
+		}*/
+		
+		/**
+		 * 修改宝宝信息,只需要修改三个字段,宝宝昵称、宝宝性别、宝宝生日,其中默认 修改状态
+		 */
+		if (user.getBaby_dob() != null) {
+			user.setStatus_(Constants.USER_ACTIVE);
+		}
+		
+		// 清楚token,防止修改
+		user.setToken(null);
+		// 修改
+		user.setId(userInfo.getId());
+		userMapper.updateUser(user);
+		
+		// 更新用户信息,并且返回
+		userInfo.setPassword(null);
+		userInfo.setBaby_dob(user.getBaby_dob());
+		userInfo.setBaby_nickname(user.getBaby_nickname());
+		userInfo.setBaby_gender(user.getBaby_gender());
+		userInfo.setStatus_(Constants.USER_ACTIVE);
+		userInfo.setToken(token);
+		if(StringUtils.isNotEmpty(user.getDisplay_name())){
+			userInfo.setDisplay_name(user.getDisplay_name());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * updateDisplayPicture
+	 *
+	 * @author Moon Cheng
+	 * @param base64
+	 * @param token
+	 * @return
+	 */
+	public String updateDisplayPicture(String imageURL, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+
+		/*if (userMapper.updateUserAvator(userInfo.getId(), base64) < 1) {
+			userMapper.insertUserAvator(userInfo.getId(), base64);
+		}*/
+	
+
+		// final String BASE_URL = "http://localhost/imberry-api";
+		int status = userMapper.updateDisplayPicture(imageURL, userInfo.getId());
+		if (status < 1) {
+			return "ERROR";
+		}
+		return imageURL;
+	}
+
+	/**
+	 * changePhone
+	 *
+	 * @author Moon Cheng
+	 * @param phone
+	 * @param token
+	 * @return
+	 */
+	public User changePhone(String phone, String token) {
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return null;
+		}
+		//  修改绑定的手机号码
+		User user = new User();
+		user.setId(userInfo.getId());
+		user.setUserTel(phone);
+
+		userMapper.updateUser(user);
+		userInfo = userMapper.selectUserById(userInfo.getId());
+		userInfo.setPassword(null);
+		return userInfo;
+	}
+
+	/**
+	 * resetPassWord
+	 *
+	 * @param oldPassword
+	 * @param newPassword
+	 * @param token
+	 * @return
+	 */
+	public int changePassword(String oldPassword, String newPassword, String token) {
+		int status = -1;
+		User userInfo = validateUserToken(token);
+		if (userInfo == null) {
+			return -1;
+		}
+
+		User user = userMapper.validateUser(userInfo.getUsername(), MD5.md5(oldPassword));
+		if (user == null) {
+			return 0;
+		}
+		
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	/**
+	 * changePassWord
+	 *
+	 * @param username,
+	 *            newPassword
+	 * @param session
+	 * @return int
+	 */
+	public int resetPassWord(String username, String newPassword) {
+		int status = 0;
+		User user = userMapper.selectUserByUsername(username);
+		if (user == null) {
+			return -3;
+		}
+		status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
+		return status;
+	}
+
+	public UserDTO tuyaConnect(User user) {
+		UserDTO userInfo = new UserDTO(user.getId(), user.getUsername(), user.getPassword(), user.getToken(), user.getDisplay_name(),
+				user.getDisplay_picture(), user.getCreated_on(), user.getExt_open_id(), user.getExt_name(), user.getExt_type(),
+				user.getLocation(), user.getBaby_nickname(), user.getBaby_dob(), user.getBaby_gender(), user.getStatus_());
+		userInfo.setPassword(null);
+		try {
+			userInfo.setEncryptUsername(AES.encrypt(user.getUsername()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		userInfo.setUserCode(Constants.TUYA_DEFAULT_PASS);
+		// Tuya connection
+		TuyaConnector.TuyaSyncConnect(userInfo.getEncryptUsername(), userInfo.getUserCode());
+		return userInfo;
+	}
+
+	/**
+	 * getStartPage
+	 *
+	 * @return String
+	 */
+	public String getStartPage() {
+		return userMapper.selectConfig("start_page");
+	}
+
+	/**
+	 * getLocation
+	 *
+	 * @param ip
+	 * @return String
+	 */
+	public RemoteIpInfoDTO getLocation(String ip) {
+		RemoteIpInfoDTO remoteIpInfoDTO = new RemoteIpInfoDTO();
+		if (ip.indexOf(",") != -1) {
+			ip = ip.split(",")[0];
+		}
+		logger.info("IP为:" + ip);
+		try {
+			String result = HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL, ip));
+			remoteIpInfoDTO = mapper.readValue(result, RemoteIpInfoDTO.class);
+		} catch (Exception e) {
+		}
+		return remoteIpInfoDTO;
+	}
+
+	/**
+	 * getApkVersion
+	 *
+	 * @return
+	 */
+	public String getApkVersion(){
+		return userMapper.selectConfig("apk_version");
+	}
+
+	@Override
+	public String selectUserAvator(Long id) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserAvator(id);
+	}
+
+	@Override
+	public User selectUserByUsername(String username) {
+		// TODO Auto-generated method stub
+		return userMapper.selectUserByUsername(username);
+	}
+}

+ 134 - 0
iamberry-app-service/src/main/java/com/iamberry/app/sqlprovider/DMLProvider.java

@@ -0,0 +1,134 @@
+package com.iamberry.app.sqlprovider;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.ibatis.jdbc.SQL;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+/**
+ * 
+ * @author Sikandar
+ * @date 2016年1月18日 下午9:34:48
+ */
+public class DMLProvider {
+
+	/**
+	 * update
+	 * 
+	 * @param map
+	 * @return String
+	 * @throws Exception
+	 */
+	public String update(Map<String, Object> map) {
+		try {
+			final String entityName = getEntityName(map);
+			final Object object_ = map.get(entityName);
+			final Class<?> cls = Class.forName(object_.getClass().getName());
+			SQL sql = new SQL() {
+				{
+					Object id = null;
+					UPDATE(entityName);
+					for (Method method : cls.getDeclaredMethods()) {
+						String mName = method.getName();
+						if (mName.startsWith("get")) {
+							Object rValue = method.invoke(object_);
+							if (mName.equalsIgnoreCase("getId")) {
+								id = rValue;
+							} else {
+								if (method.getReturnType() == String.class) {
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + " = '" + rValue + "'");
+								} else if (method.getReturnType() == Date.class) {
+
+									SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + " = '" + format.format(rValue) + "'");
+								} else {
+									if (rValue != null)
+										SET(mName.substring(mName.indexOf("get") + 3).toLowerCase() + "=" + rValue.toString());
+								}
+							}
+						}
+					}
+
+					WHERE("id = " + id);
+				}
+			};
+
+			return sql.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * insert
+	 * 
+	 * @param map
+	 * @return String
+	 */
+	public String insert(Map<String, Object> map) {
+		try {
+
+			final String entityName = getEntityName(map);
+			final Object object_ = map.get(entityName);
+			final Class<?> cls = Class.forName(object_.getClass().getName());
+			SQL sql = new SQL() {
+				{
+					INSERT_INTO(entityName);
+					for (Method method : cls.getDeclaredMethods()) {
+						String mName = method.getName();
+						if (mName.startsWith("get")) {
+							Object rValue = method.invoke(object_);
+							if (method.getReturnType() == String.class) {
+								if (rValue == null)
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "" + rValue + "");
+								else
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "'" + rValue + "'");
+							} else if (method.getReturnType() == Date.class) {
+
+								SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+								if (rValue != null)
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "'" + format.format(rValue) + "'");
+								else
+									VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), "" + null + "");
+							} else
+								VALUES(mName.substring(mName.indexOf("get") + 3).toLowerCase(), rValue == null ? "0" : rValue.toString());
+						}
+					}
+				}
+			};
+
+			return sql.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+	private String getEntityName(Map<String, Object> map) throws Exception {
+		String entityName = null;
+		for (Object object_ : map.values()) {
+			Class<?> cls = Class.forName(object_.getClass().getName());
+			for (Annotation annotation : cls.getAnnotations()) {
+				if (annotation instanceof Qualifier) {
+					Qualifier myAnnotation = (Qualifier) annotation;
+					entityName = myAnnotation.value();
+				}
+			}
+		}
+
+		if (entityName == null)
+			throw new Exception(
+					"@Qualifier not found, Entity should be defined with @Qualifier name, @Qualifier name must match DataBase table name");
+		return entityName;
+
+	}
+
+}

+ 33 - 0
iamberry-app-service/src/main/java/com/iamberry/app/start/InitApp.java

@@ -0,0 +1,33 @@
+package com.iamberry.app.start;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.support.AbstractApplicationContext;
+
+import com.iamberry.app.core.entity.User;
+import com.iamberry.app.face.UserService;
+import com.iamberry.app.mapper.UserMapper;
+import com.iamberry.app.service.MilkServiceImpl;
+import com.iamberry.app.ulitity.Utility;
+
+@ImportResource("classpath:iamberry-app-service-spring.xml")
+@SpringBootApplication
+public class InitApp {
+    @Bean
+    public CountDownLatch closeLatch() {
+        return new CountDownLatch(1);
+    }
+	public static void main(String[] args) throws Exception {
+		AbstractApplicationContext ctx = (AbstractApplicationContext) new SpringApplicationBuilder().sources(InitApp.class).web(false).run(args);
+		CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
+		
+		//System.out.println(ctx.getBean(MilkServiceImpl.class).getMilkRecordByDate("0020002518fe34d45136", "2016"));
+		
+		closeLatch.await();
+	}
+}

+ 374 - 0
iamberry-app-service/src/main/java/com/iamberry/app/ulitity/Utility.java

@@ -0,0 +1,374 @@
+package com.iamberry.app.ulitity;
+
+import static com.iamberry.app.config.ImberryConfig.SMS_PASSWORD;
+import static com.iamberry.app.config.ImberryConfig.SMS_TEXT;
+import static com.iamberry.app.config.ImberryConfig.SMS_URL;
+import static com.iamberry.app.config.ImberryConfig.SMS_USERNAME;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+
+import com.iamberry.app.config.Constants;
+import com.iamberry.app.core.dto.RecordDTO;
+import com.iamberry.app.tool.dto.AddressDTO;
+import com.iamberry.app.tool.util.HttpUtility;
+import com.iamberry.app.tool.util.JsonParseUtil;
+import com.iamberry.app.tool.util.Result;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
+
+public class Utility {
+
+	public static String DATA_STORE = "";
+	private static final String AB = "123456789abcdefghijklmnpqrstuvwxyz";
+
+	private static Random rnd = new Random();
+
+	public static String getDateByDay() {
+		Calendar cal = Calendar.getInstance();
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(cal.get(Calendar.YEAR));
+		buffer.append(cal.get(Calendar.MONTH) + 1);
+		buffer.append(cal.get(Calendar.DAY_OF_MONTH));
+		return buffer.toString();
+	}
+
+	public static boolean contains(String[] array, String item) {
+		try {
+			for (int i = 0; i < array.length; i++) {
+				if (array[i].equals(item)) {
+					return true;
+				}
+			}
+		} catch (Exception ex) {
+
+		}
+		return false;
+	}
+
+	public static String normalizePath(String path) {
+		return path.replace("\\\\", "\\").replace("\\", "/").replace("//", "/").replace("..", ".");
+	}
+
+	public static String getRandomString(int len) {
+		StringBuilder sb = new StringBuilder(len);
+		for (int i = 0; i < len; i++)
+			sb.append(AB.charAt(rnd.nextInt(AB.length())));
+		return sb.toString();
+	}
+
+	public static int CalculateAge(Long date) {
+		Date birthDate = new Date(0);
+		if (date != null)
+			birthDate = new Date(date);
+		SimpleDateFormat format = new SimpleDateFormat("yyyy");
+		int birthYear = Integer.parseInt(format.format(birthDate));
+		int currentYear = Integer.parseInt(format.format(new Date(System.currentTimeMillis())));
+		int age = currentYear - birthYear;
+
+		return age;
+	}
+
+	public static List<RecordDTO> convertMap(List<Map<String, Object>> list, String dateType) {
+		List<RecordDTO> maps = new ArrayList<RecordDTO>();
+		try {
+			SimpleDateFormat sdf = null;
+			for (Map<String, Object> map : list) {
+				switch (dateType) {
+				case "days":
+					sdf = new SimpleDateFormat("yyyyMMddHH");
+					break;
+				case "weeks":
+					sdf = new SimpleDateFormat("yyyyMMdd");
+					break;
+				case "years":
+					sdf = new SimpleDateFormat("yyyyMM");
+					break;
+				}
+				Date key = sdf.parse(map.get(dateType).toString());
+				Double value = Double.parseDouble(map.get("volume").toString());
+				maps.add(new RecordDTO(key.getTime(), value));
+			}
+		} catch (Exception e) {
+		}
+		return maps;
+	}
+
+	public static Map<String, List<RecordDTO>> synAppMachineRecord(Map<String, List<RecordDTO>> oldMap) {
+		Map<String, List<RecordDTO>> synMap = oldMap;
+		int appSize = synMap.get("app").size();
+		int machineSize = synMap.get("machine").size();
+		int signer = 0;
+		long appDate = 0l, machineDate = 0l;
+		RecordDTO appRecord, machineRecord;
+		for (int i = 0; i < appSize && i < machineSize; i++) {
+			appRecord = synMap.get("app").get(i);
+			machineRecord = synMap.get("machine").get(signer);
+			appDate = appRecord.getRecordDate();
+			machineDate = machineRecord.getRecordDate();
+			if (appDate == machineDate) {
+				signer++;
+			} else if (appDate < machineDate) {
+				synMap.get("machine").add(i, new RecordDTO(appDate, 0));
+				machineSize++;
+				signer++;
+			} else {
+				synMap.get("app").add(signer, new RecordDTO(machineDate, 0));
+				appSize++;
+				signer++;
+			}
+		}
+		while (signer < machineSize) {
+			synMap.get("app").add(new RecordDTO(synMap.get("machine").get(signer).getRecordDate(), 0));
+			signer++;
+		}
+		while (signer < appSize) {
+			synMap.get("machine").add(new RecordDTO(synMap.get("app").get(signer).getRecordDate(), 0));
+			signer++;
+		}
+		return synMap;
+	}
+
+	public static Map<String, List<RecordDTO>> fillAppMachineRecordWithZero(Map<String, List<RecordDTO>> synedMap, String dataType,
+			String chosenDate) {
+		Map<String, List<RecordDTO>> fillMap = synedMap;
+		Calendar calendar = Calendar.getInstance();
+		List<Integer> existTimePoint = new ArrayList<Integer>();
+		long timePoint = 0l;
+		switch (dataType) {
+		case "days":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.HOUR_OF_DAY));
+			});
+			for (int i = 0; i < 24; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.HOUR_OF_DAY, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i, new RecordDTO(timePoint, 0));
+				}
+			}
+			break;
+		case "weeks":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.DAY_OF_WEEK));
+			});
+			if (existTimePoint.contains(new Integer(1))) {
+				calendar.add(Calendar.DATE, -7);
+			}
+			for (int i = 2; i <= 7; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.DAY_OF_WEEK, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i - 2, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i - 2, new RecordDTO(timePoint, 0));
+				}
+			}
+			if (!existTimePoint.contains(new Integer(1))) {
+				calendar.add(Calendar.DATE, 7);
+				calendar.set(Calendar.DAY_OF_WEEK, 1);
+				timePoint = calendar.getTimeInMillis();
+				fillMap.get("app").add(new RecordDTO(timePoint, 0));
+				fillMap.get("machine").add(new RecordDTO(timePoint, 0));
+			}
+			break;
+		case "years":
+			if (fillMap.get("app").isEmpty()) {
+				calendar.setTime(Utility.formatStringToDate("yyyy-MM-dd HH:mm:ss", chosenDate));
+			}
+			fillMap.get("app").forEach(record -> {
+				calendar.setTime(new Date(record.getRecordDate()));
+				existTimePoint.add(calendar.get(Calendar.MONTH));
+			});
+			for (int i = 0; i <= 11; i++) {
+				if (!existTimePoint.remove(new Integer(i))) {
+					calendar.set(Calendar.MONTH, i);
+					timePoint = calendar.getTimeInMillis();
+					fillMap.get("app").add(i, new RecordDTO(timePoint, 0));
+					fillMap.get("machine").add(i, new RecordDTO(timePoint, 0));
+				}
+			}
+			break;
+		}
+		return fillMap;
+	}
+
+	public static String getRandomCode(int len) {
+		StringBuilder sb = new StringBuilder(len);
+		for (int i = 0; i < len; i++)
+			sb.append("0123456789".charAt(rnd.nextInt("0123456789".length())));
+		return sb.toString();
+	}
+
+	public static String getIp(HttpServletRequest request) {
+		String ip = request.getHeader("x-forwarded-for");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		return ip;
+	}
+
+	public static String CDN_WRITE_BASE_64_URL = "http://cms.iamberry.com/open-cdn/ssl/data/write/base64";
+
+	public static String uploadBase64File(String base64Data, String path) {
+		try {
+			if (base64Data != null) {
+				StringBody pic = new StringBody(base64Data, ContentType.DEFAULT_TEXT);
+				StringBody type = new StringBody("jpg", ContentType.TEXT_PLAIN);
+				HttpEntity entity = MultipartEntityBuilder.create().addPart("type", type).addPart("base64data", pic)
+						.build();
+				String result = HttpUtility.httpsPost(CDN_WRITE_BASE_64_URL, entity);
+
+				JSONObject json = new JSONObject(result);
+				int requestSatus = json.getJSONObject("header").getInt("status");
+				if (1000 == requestSatus) {
+					path = json.getJSONObject("data").get("url").toString();
+				}
+
+				return path;
+			}
+		} catch (Exception e) {
+			return null;
+		}
+		return "";
+	}
+
+	public static String readFile(InputStream in) {
+		BufferedReader reader = null;
+		String result = "";
+		try {
+			InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8");
+			reader = new BufferedReader(inputStreamReader);
+			String tempString = null;
+			while ((tempString = reader.readLine()) != null) {
+				result += tempString;
+			}
+			reader.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (reader != null) {
+				try {
+					reader.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return result;
+	}
+
+	public static String sendCodeAsSMS(String phoneNum, Map<String, Integer> status) throws Exception {
+		String code = getRandomCode(4);
+		CloseableHttpClient client = HttpClients.createDefault();
+		Map<String, String> params = new HashMap<String, String>();
+		CloseableHttpResponse response = null;
+		params.put("username", SMS_USERNAME);
+		params.put("password", SMS_PASSWORD);
+		params.put("mobile", phoneNum);
+		params.put("content", MessageFormat.format(SMS_TEXT, code));
+		HttpPost method = new HttpPost(SMS_URL);
+		if (params != null) {
+			List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+			for (Map.Entry<String, String> param : params.entrySet()) {
+				NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+				paramList.add(pair);
+			}
+			method.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
+		}
+		response = client.execute(method);
+		HttpEntity entity = response.getEntity();
+		if (entity != null) {
+			String result = EntityUtils.toString(entity);
+			XStream xs = new XStream(new StaxDriver());
+			xs.alias("result", Result.class);
+			Result object = (Result)xs.fromXML(result);
+			response.close();
+			status.put(Constants.SMS_RETURNCODE, object.getResultcode());
+			if (0 == object.getResultcode()) {
+				return code;
+			}
+		}
+		return null;
+	}
+
+	public static AddressDTO getDefaultAddress(String jsonList) {
+		List<AddressDTO> addressDTOs = JsonParseUtil.parseAddressList(jsonList);
+		for (AddressDTO addressDTO : addressDTOs) {
+			if (addressDTO.getDefaultAddress() == 1) {
+				return addressDTO;
+			}
+		}
+		return null;
+	}
+
+	public static String getOrderSn(Long id) {
+		if (id == null)
+			throw new NullPointerException("id can not be null");
+
+		SimpleDateFormat format = new SimpleDateFormat("yyMMdd");
+		String date = format.format(new Date());
+		String sn = String.format("%0" + 5 + "d", id);
+		return "LTR" + date + sn;
+	}
+
+	public static String formatDateToString(String format, Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat(format);
+		return sdf.format(date);
+	}
+
+	public static Date formatStringToDate(String format, String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat(format);
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+			date = new Date();
+		}
+		return date;
+	}
+
+}

+ 51 - 0
iamberry-app-service/src/main/resources/iamberry-app-service-datasource.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xmlns:aop="http://www.springframework.org/schema/aop"
+	   xmlns:context="http://www.springframework.org/schema/context"
+	   xmlns:tx="http://www.springframework.org/schema/tx"
+	   xmlns:p="http://www.springframework.org/schema/p"
+	   xsi:schemaLocation="http://www.springframework.org/schema/beans
+					http://www.springframework.org/schema/beans/spring-beans.xsd
+					http://www.springframework.org/schema/aop
+					http://www.springframework.org/schema/aop/spring-aop.xsd
+					http://www.springframework.org/schema/context
+					http://www.springframework.org/schema/context/spring-context.xsd
+					http://www.springframework.org/schema/tx
+					http://www.springframework.org/schema/tx/spring-tx.xsd">
+					
+	<bean id="jdbcUrlBean" class="com.iamberry.wechat.tools.DataSourceManager"></bean>
+
+    <!--app 前台配置库数据源-->
+    <bean id="ratfwDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
+		<property name="driverClass" value="#{jdbcUrlBean.jdbcDriver}"></property>
+		<property name="jdbcUrl" value="#{jdbcUrlBean.jdbcUrl}"></property>
+		<property name="user" value="#{jdbcUrlBean.jdbcUserName}"></property>
+		<property name="password" value="#{jdbcUrlBean.jdbcPassword}"></property>
+		<!--连接池初始化值 -->
+		<property name="initialPoolSize" value="3"></property>
+		<!--连接池最大值 -->
+		<property name="maxPoolSize" value="#{jdbcUrlBean.maxPoolSize}"></property>
+		<!--最小空闲值,当空闲连接少于阀值时,连接池会预申请一些连接 -->
+		<property name="minPoolSize" value="2"></property>
+	</bean>
+	
+	<!-- 自动扫描SQL隐射文件 -->
+	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+		<!-- basePackage:指定SQL映射文件、接口的包,自动加载SQL映射文件和接口 -->
+		<property name="basePackage" value="com.iamberry.app.mapper"></property>
+		<!-- 引用SQLSessionFactoryBean -->
+		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
+	</bean>
+	
+	<!-- 配置SqlSessionFactoryBean -->
+	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
+		<!-- 配置数据源 -->
+		<property name="dataSource" ref="ratfwDataSource" />
+		<property name="configLocation" value="classpath:iamberry-app-service-mybatis.xml" />
+		<property name="mapperLocations" value="classpath:com/iamberry/app/mapper/*.xml" />
+	</bean>
+	
+	<!-- 开启注解事务 -->
+	<tx:annotation-driven transaction-manager="transactionManager"/>
+</beans>

+ 34 - 0
iamberry-app-service/src/main/resources/iamberry-app-service-mybatis.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	<!-- 设置  -->
+	<settings>  
+        <!--set lazy fetching-->  
+        <setting name="lazyLoadingEnabled" value="false" />  
+        <setting name="logImpl" value="LOG4J"/>  
+		<setting name="mapUnderscoreToCamelCase" value="true" />
+		<!-- 允许使用列标签代替列名 -->  
+		<setting name="useColumnLabel" value="true" />  
+		<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->  
+		<setting name="useGeneratedKeys" value="true" />  
+    </settings>
+    
+    <!-- 配置Entitys -->
+    <typeAliases>
+    	<typeAlias type="com.iamberry.app.core.entity.Machine" alias="Machine"/>
+    	<typeAlias type="com.iamberry.app.core.entity.Message" alias="Message"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkImages" alias="MilkImages"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkMakingRecord" alias="MilkMakingRecord"/>
+    	<typeAlias type="com.iamberry.app.core.entity.MilkPowderInfo" alias="MilkPowderInfo"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SharedMachine" alias="SharedMachine"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SysConfig" alias="SysConfig"/>
+    	<typeAlias type="com.iamberry.app.core.entity.SysLog" alias="SysLog"/>
+    	<typeAlias type="com.iamberry.app.core.entity.User" alias="User"/>
+    	<typeAlias type="com.iamberry.app.core.entity.UserAvator" alias="UserAvator"/>
+    	
+    	<typeAlias type="com.iamberry.wechat.core.entity.PageBean" alias="PageBean"/>
+    	<typeAlias type="com.iamberry.app.core.serch.SerchParam" alias="SerchParam"/>
+    	<typeAlias type="com.iamberry.app.core.entity.CodeValid" alias="CodeValid"/>
+    	
+    </typeAliases>
+</configuration>

+ 31 - 0
iamberry-app-service/src/main/resources/iamberry-app-service-provider.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+					http://www.springframework.org/schema/beans/spring-beans.xsd
+					http://code.alibabatech.com/schema/dubbo          
+   					http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+	<!-- 提供方应用信息,用于计算依赖关系-->
+    <dubbo:application name="iamberry-app-service-provider"/>
+   
+ 	
+    <!-- 用dubbo协议在20880端口暴露服务 -->
+    <dubbo:protocol name="dubbo" port="-1"/>
+    
+ 	<!-- 使用zookeeper注册中心暴露服务地址 -->
+	<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+    
+   <dubbo:monitor protocol="registry"/>
+    
+    <!-- 当ProtocolConfig和ServiceConfig没有设置时,使用默认值 -->
+    <dubbo:provider timeout="30000" threadpool="fixed" threads="500" accepts="100" accesslog="true"/>
+ 
+    <!-- 用dubbo协议在20880端口暴露服务 -->
+    <dubbo:protocol name="dubbo" port="20880"/>
+    <dubbo:service interface="com.iamberry.app.face.MessageService" ref="messageServiceImpl"></dubbo:service>
+    <dubbo:service interface="com.iamberry.app.face.LogService" ref="logServiceImpl"></dubbo:service>
+    <dubbo:service interface="com.iamberry.app.face.UserService" ref="userServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.MilkService" ref="milkServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.MachineService" ref="machineServiceImpl"></dubbo:service>
+	<dubbo:service interface="com.iamberry.app.face.CodeService" ref="codeServiceImpl"></dubbo:service>
+</beans>

+ 54 - 0
iamberry-app-service/src/main/resources/iamberry-app-service-spring.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	default-autowire="byName"
+	default-lazy-init="true"
+    xmlns:task="http://www.springframework.org/schema/task"
+	xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:ehcache-spring="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:websocket="http://www.springframework.org/schema/websocket" 
+	xsi:schemaLocation=
+		"http://www.springframework.org/schema/aop
+		http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
+		http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd
+		http://www.springframework.org/schema/cache
+		http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
+		http://www.springframework.org/schema/tx 
+		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
+		http://www.springframework.org/schema/task  
+		http://www.springframework.org/schema/task/spring-task-3.1.xsd  
+		http://www.springframework.org/schema/websocket 
+		http://www.springframework.org/schema/websocket/spring-websocket.xsd
+		http://www.springframework.org/schema/context
+		http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+		
+	<!-- 配置自动扫描的包:不扫描控制器和异常处理 -->
+	<context:component-scan base-package="com.iamberry">
+		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
+		<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
+	</context:component-scan>
+	
+	<!-- 使用CGLIB动态代理 -->
+    <aop:aspectj-autoproxy proxy-target-class="true"/>
+	<!-- 开启注解启动定时器 -->
+    <task:annotation-driven/>
+    
+	<import resource="classpath:iamberry-app-service-datasource.xml"/>
+	
+	<!-- Spring -->
+	<bean class="com.iamberry.zk.SpringContextHolder" lazy-init="false"/>
+	
+	<!-- 通过Dubbo 完成SOA	-->
+    <import resource="classpath:iamberry-app-service-provider.xml"/> 
+    
+    <!-- 启动ZK 上报机器信息的节点 -->
+	<bean class="com.iamberry.zk.StartZK" lazy-init="false"/>
+</beans>

+ 14 - 0
iamberry-app-service/src/main/resources/jdbc.properties

@@ -0,0 +1,14 @@
+#mysql version database setting
+jdbc.driver=com.mysql.jdbc.Driver
+#server user
+jdbc.username=root
+jdbc.password=root
+#jdbc.password=y2kroot
+# default 3
+jdbc.minPoolSize=5
+# default 15
+jdbc.maxPoolSize=10
+# default 3
+jdbc.initialPoolSize=3
+#jdbc.url=jdbc:mysql://cms.iamberry.com:3306/iamberry_app?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
+jdbc.url=jdbc:mysql://192.168.1.254:3306/iamberry_app?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull

+ 42 - 0
iamberry-app-service/src/main/resources/log4j.properties

@@ -0,0 +1,42 @@
+#levels: debug, info, warn, error, fatal
+log4j.rootLogger=info,stdout,infoLog,errorLog,dbLog
+
+#\u63a7\u5236\u53f0
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
+
+#\u4e3b\u65e5\u5fd7\u6587\u4ef6
+log4j.appender.infoLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.infoLog.File=D:/log/iamberry/app/iamberry_info.log
+log4j.appender.infoLog.Append=true
+log4j.appender.infoLog.Threshold=INFO
+log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.infoLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.infoLog.encoding=UTF-8
+
+#\u9519\u8bef\u65e5\u5fd7
+log4j.appender.errorLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.errorLog.File=D:/log/iamberry/app/iamberry_error.log
+log4j.appender.errorLog.Append=true
+log4j.appender.errorLog.Threshold=ERROR
+log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.errorLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.errorLog.encoding=UTF-8
+
+#debug\u4FE1\u606F
+log4j.appender.dbLog=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.dbLog.File=D:/log/iamberry/app/iamberry_debug.log
+log4j.appender.dbLog.Append=true
+log4j.appender.dbLog.Threshold=DEBUG
+log4j.appender.dbLog.layout=org.apache.log4j.PatternLayout
+log4j.appender.dbLog.layout.ConversionPattern=%d %p [%c] - %m %n 
+log4j.appender.dbLog.encoding=UTF-8
+
+#\u663e\u793aSQL\u8bed\u53e5\u90e8\u5206
+log4j.logger.com.iamberry.app=DEBUG
+log4j.logger.java.sql.ResultSet=INFO
+log4j.logger.java.sql.Connection=DEBUG
+log4j.logger.java.sql.Statement=DEBUG
+log4j.logger.java.sql.PreparedStatement=DEBUG

BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/CodeMapper.class


BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/LogMapper.class


BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/MachineMapper.class


BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/MessageMapper.class


BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/MilkMapper.class


BIN
iamberry-app-service/target/classes/com/iamberry/app/mapper/UserMapper.class


+ 59 - 0
iamberry-app-service/target/classes/com/iamberry/app/mapper/codeMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.CodeMapper">
+	
+	<!-- 保存一个发送记录 -->
+	<insert id="save" parameterType="CodeValid">
+		INSERT INTO
+			CODE_VALID
+				(
+					CODE_PHONE, CODE_VALUE, CODE_SEND_DATE, CODE_VALID_DATE, 
+					CODE_STATUS, CODE_MSG, CODE_CHANNEL, CODE_USE, CODE_SCENARIO
+				)
+		VALUES
+			(
+				#{codePhone}, #{codeValue}, #{codeSendDate}, #{codeValidDate}, 
+				#{codeStatus}, #{codeMsg}, #{codeChannel}, #{codeUse}, #{codeScenario}
+			)
+	</insert>
+	
+	<!-- 获取用户最近的记录 -->
+	<select id="getLast" parameterType="string" resultType="CodeValid">
+		SELECT 
+			*
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		ORDER BY 
+			CODE_ID DESC
+		LIMIT 0, 1
+	</select>
+	
+	<!-- 根据code_id,更新本次记录状态 -->
+	<update id="update" parameterType="long">
+		UPDATE 
+			CODE_VALID 
+		SET 
+			CODE_USE = 1
+		WHERE 
+			CODE_ID = #{codeID}
+	</update>
+	
+	<!-- 检查当前手机号码发送的次数 -->
+	<select id="getInterval" parameterType="java.util.Map" resultType="int">
+		<![CDATA[
+		SELECT 
+			count(code_id)
+		FROM 
+			CODE_VALID 
+		WHERE 
+			CODE_PHONE = #{phone}
+		AND
+			CODE_SEND_DATE >= #{startDate}
+		AND
+			CODE_SEND_DATE <= #{enDate}
+		]]>
+	</select>
+</mapper>

+ 17 - 0
iamberry-app-service/target/classes/com/iamberry/app/mapper/logMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样 namespace:必须与对应的接口全类名一致 -->
+<mapper namespace="com.iamberry.app.mapper.LogMapper">
+	
+	<insert id="insertSysLog" parameterType="SysLog">
+		INSERT INTO
+			SYS_LOG
+				(
+					LOG_TYPE, OPERATION, DETAIL, TIMESTAMP_
+				)
+		VALUES
+			(
+				#{log_type}, #{operation}, #{detail}, #{timestamp_}
+			)
+	</insert>
+</mapper>

+ 124 - 0
iamberry-app-service/target/classes/com/iamberry/app/mapper/machineMapper.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper 
+PUBLIC 
+	"-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 命名,每一个映射对象不一样
+	namespace:必须与对应的接口全类名一致
+ -->
+<mapper namespace="com.iamberry.app.mapper.MachineMapper">
+	<sql id="allMachineField">
+		ID,
+		OWNER,
+		MACHINE_NAME,
+		MACHINE_MAC,
+		MACHINE_INFO,
+		STATUS_,
+		LOCATION,
+		CREATED_ON
+	</sql>
+	
+	<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
+    <resultMap type="Machine" id="machineMap">
+        <!-- 用id属性来映射主键字段 -->
+        <id property="id" column="id"/>
+        <!-- 用result属性来映射非主键字段 -->
+        <result property="owner" column="owner"/>
+        <result property="machine_name" column="machine_name"/>
+        <result property="machine_mac" column="machine_mac"/>
+        <result property="machine_info" column="machine_info"/>
+        <result property="status_" column="status_"/>
+        <result property="location" column="location"/>
+        <result property="created_on" column="created_on"/>
+    </resultMap>
+    
+    
+	<!-- 添加一台机器 -->
+	<insert id="insertMachine" parameterType="Machine"
+		useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO MACHINE 
+			(MACHINE_NAME,MACHINE_MAC,MACHINE_INFO,OWNER,STATUS_,LOCATION,CREATED_ON)
+		VALUES
+			(
+				#{machine_name},#{machine_mac},#{machine_info},#{owner}
+				,#{status_},#{location},#{created_on}
+			)
+	</insert>
+
+	<!-- 根据id 修改一台机器信息  -->
+	<update id="updateMachine" parameterType="Machine">
+		UPDATE MACHINE
+		<set>
+			<if test="owner != null and owner != ''">
+				OWNER=#{owner},
+			</if>
+			<if test="machine_name != null and machine_name != ''">
+				MACHINE_NAME=#{machine_name},
+			</if>
+			<if test="machine_mac != null and machine_mac != ''">
+				MACHINE_MAC=#{machine_mac},
+			</if>
+			<if test="machine_info != null and machine_info != ''">
+				MACHINE_INFO=#{machine_info},
+			</if>
+			<if test="status_ != null and status_ != ''">
+				STATUS_=#{status_},
+			</if>
+			<if test="location != null and location != ''">
+				LOCATION=#{location},
+			</if>
+			<if test="created_on != null and created_on != ''">
+				CREATED_ON=#{created_on},
+			</if>
+		</set>
+		WHERE ID=#{id}
+	</update>
+	
+	<!-- 根据id 修改一台机器的状态-->
+	<update id="updateMachineStatus" parameterType="Machine">
+		UPDATE MACHINE 
+		SET STATUS_ = #{0},CREATED_ON = NOW() 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 根据机器码 修改一台机器的状态-->
+	<update id="updateStatusByMac">
+		UPDATE MACHINE 
+		SET STATUS_ = #{1},CREATED_ON = NOW() 
+		WHERE machine_mac = #{0}
+	</update>
+	
+	<!-- 根据id 修改一台机器的位置信息-->
+	<update id="updateMachineLocation" parameterType="Machine">
+		UPDATE MACHINE 
+		SET LOCATION = #{0} 
+		WHERE ID = #{1}
+	</update>
+	
+	<!-- 按用户,查询所有机器 -->
+	<select id="selectMachineByOwner" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE OWNER = #{owner}
+	</select>
+	
+	<!-- 根据id 查询一台机器 -->
+	<select id="selectMachineById" parameterType="long" resultMap="machineMap">
+		SELECT 
+			<include refid="allMachineField"></include>
+		FROM MACHINE WHERE ID = #{id}
+	</select>
+	
+	<!-- 根据机器码和所属用户 查一台机器id -->
+	<select id="isDevUserPairExist" resultType="Long">
+		SELECT ID
+		FROM MACHINE WHERE  MACHINE_MAC = #{0} AND OWNER = #{1}
+	</select>
+	
+	<!-- 根据机器的ID,查询最近的一个用户ID -->
+	<select id="selectUserIDByDevId" parameterType="String" resultType="Long">
+		SELECT OWNER 
+		FROM MACHINE 
+		WHERE MACHINE_MAC = #{devid} ORDER BY id DESC LIMIT 0, 1
+	</select>
+</mapper>

+ 0 - 0
iamberry-app-service/target/classes/com/iamberry/app/mapper/messageMapper.xml


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff