Commit 9f0199adfba1281c387619bc3740943a2cf862d2
Merge remote-tracking branch 'origin/develop' into develop
Showing
48 changed files
with
3376 additions
and
1037 deletions
Too many changes to show.
To preserve performance only 40 of 48 files are displayed.
.idea/encodings.xml
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <project version="4"> | 2 | <project version="4"> |
3 | - <component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8"> | 3 | + <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8"> |
4 | <file url="file://$PROJECT_DIR$" charset="UTF-8" /> | 4 | <file url="file://$PROJECT_DIR$" charset="UTF-8" /> |
5 | + <file url="file://$PROJECT_DIR$/src/main/resources/application.yml" charset="UTF-8" /> | ||
5 | <file url="PROJECT" charset="UTF-8" /> | 6 | <file url="PROJECT" charset="UTF-8" /> |
6 | </component> | 7 | </component> |
7 | </project> | 8 | </project> |
8 | \ No newline at end of file | 9 | \ No newline at end of file |
.idea/workspace.xml
@@ -2,15 +2,21 @@ | @@ -2,15 +2,21 @@ | ||
2 | <project version="4"> | 2 | <project version="4"> |
3 | <component name="ChangeListManager"> | 3 | <component name="ChangeListManager"> |
4 | <list default="true" id="9ff7b25e-dc1a-4859-8a0c-00039489e359" name="Default Changelist" comment=""> | 4 | <list default="true" id="9ff7b25e-dc1a-4859-8a0c-00039489e359" name="Default Changelist" comment=""> |
5 | - <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" /> | 5 | + <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/receiptType/controller/receiptTypeController.java" afterDir="false" /> |
6 | + <change afterPath="$PROJECT_DIR$/src/main/resources/mybatis/general/BomDetailMapper.xml" afterDir="false" /> | ||
7 | + <change afterPath="$PROJECT_DIR$/src/main/resources/templates/config/receiptType/add.html" afterDir="false" /> | ||
8 | + <change afterPath="$PROJECT_DIR$/src/main/resources/templates/config/receiptType/edit.html" afterDir="false" /> | ||
9 | + <change afterPath="$PROJECT_DIR$/src/main/resources/templates/config/receiptType/receiptType.html" afterDir="false" /> | ||
6 | <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | 10 | <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> |
7 | - <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" /> | ||
8 | - <change beforePath="$PROJECT_DIR$/src/main/resources/static/img/qr_code.png" beforeDir="false" /> | ||
9 | - <change beforePath="$PROJECT_DIR$/src/main/resources/templates/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/templates/index.html" afterDir="false" /> | ||
10 | - <change beforePath="$PROJECT_DIR$/src/main/resources/templates/login.html" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/templates/login.html" afterDir="false" /> | ||
11 | - <change beforePath="$PROJECT_DIR$/src/test/java/com.huaheng.test/CreateCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/test/java/com.huaheng.test/CreateCode.java" afterDir="false" /> | 11 | + <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptType/domain/ReceiptType.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/receiptType/domain/ReceiptType.java" afterDir="false" /> |
12 | + <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptType/mapper/ReceiptTypeMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/receiptType/mapper/ReceiptTypeMapper.java" afterDir="false" /> | ||
13 | + <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptType/service/ReceiptTypeService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/receiptType/service/ReceiptTypeService.java" afterDir="false" /> | ||
14 | + <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptType/service/ReceiptTypeServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/receiptType/service/ReceiptTypeServiceImpl.java" afterDir="false" /> | ||
15 | + <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java" afterDir="false" /> | ||
16 | + <change beforePath="$PROJECT_DIR$/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application.yml" afterDir="false" /> | ||
17 | + <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/receipt/ReceiptTypeMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mybatis/config/ReceiptTypeMapper.xml" afterDir="false" /> | ||
18 | + <change beforePath="$PROJECT_DIR$/src/main/resources/templates/tool/import/import.html" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/templates/tool/import/import.html" afterDir="false" /> | ||
12 | </list> | 19 | </list> |
13 | - <ignored path="$PROJECT_DIR$/target/" /> | ||
14 | <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> | 20 | <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> |
15 | <option name="SHOW_DIALOG" value="false" /> | 21 | <option name="SHOW_DIALOG" value="false" /> |
16 | <option name="HIGHLIGHT_CONFLICTS" value="true" /> | 22 | <option name="HIGHLIGHT_CONFLICTS" value="true" /> |
@@ -28,36 +34,32 @@ | @@ -28,36 +34,32 @@ | ||
28 | <option name="HIDDEN_KINDS"> | 34 | <option name="HIDDEN_KINDS"> |
29 | <set /> | 35 | <set /> |
30 | </option> | 36 | </option> |
31 | - <expand /> | 37 | + <expand> |
38 | + <path> | ||
39 | + <item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" /> | ||
40 | + <item name="@172.16.29.45" type="feb32156:DbDataSourceImpl" /> | ||
41 | + </path> | ||
42 | + <path> | ||
43 | + <item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" /> | ||
44 | + <item name="@172.16.29.45" type="feb32156:DbDataSourceImpl" /> | ||
45 | + <item name="schemas" type="d4e8921:DatabaseStructure$FamilyGroup" /> | ||
46 | + </path> | ||
47 | + <path> | ||
48 | + <item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" /> | ||
49 | + <item name="@172.16.29.45" type="feb32156:DbDataSourceImpl" /> | ||
50 | + <item name="schemas" type="d4e8921:DatabaseStructure$FamilyGroup" /> | ||
51 | + <item name="wms_v2: schema" type="76f4a085:MysqlImplModel$Schema" /> | ||
52 | + </path> | ||
53 | + </expand> | ||
32 | <select /> | 54 | <select /> |
33 | </component> | 55 | </component> |
34 | - <component name="FileEditorManager"> | ||
35 | - <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> | ||
36 | - <file pinned="false" current-in-tab="false"> | ||
37 | - <entry file="file://$PROJECT_DIR$/pom.xml"> | ||
38 | - <provider selected="true" editor-type-id="text-editor"> | ||
39 | - <state relative-caret-position="248"> | ||
40 | - <caret line="16" column="40" selection-start-line="16" selection-start-column="40" selection-end-line="16" selection-end-column="40" /> | ||
41 | - </state> | ||
42 | - </provider> | ||
43 | - <provider editor-type-id="MavenHelperPluginDependencyAnalyzer" /> | ||
44 | - </entry> | ||
45 | - </file> | ||
46 | - <file pinned="false" current-in-tab="true"> | ||
47 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/login.html"> | ||
48 | - <provider selected="true" editor-type-id="text-editor"> | ||
49 | - <state relative-caret-position="289"> | ||
50 | - <caret line="40" column="24" selection-start-line="40" selection-start-column="24" selection-end-line="40" selection-end-column="24" /> | ||
51 | - </state> | ||
52 | - </provider> | ||
53 | - </entry> | ||
54 | - </file> | ||
55 | - </leaf> | ||
56 | - </component> | ||
57 | <component name="FileTemplateManagerImpl"> | 56 | <component name="FileTemplateManagerImpl"> |
58 | <option name="RECENT_TEMPLATES"> | 57 | <option name="RECENT_TEMPLATES"> |
59 | <list> | 58 | <list> |
59 | + <option value="FxmlFile" /> | ||
60 | + <option value="Interface" /> | ||
60 | <option value="Class" /> | 61 | <option value="Class" /> |
62 | + <option value="HTML File" /> | ||
61 | </list> | 63 | </list> |
62 | </option> | 64 | </option> |
63 | </component> | 65 | </component> |
@@ -69,21 +71,6 @@ | @@ -69,21 +71,6 @@ | ||
69 | </map> | 71 | </map> |
70 | </option> | 72 | </option> |
71 | </component> | 73 | </component> |
72 | - <component name="IdeDocumentHistory"> | ||
73 | - <option name="CHANGED_PATHS"> | ||
74 | - <list> | ||
75 | - <option value="$PROJECT_DIR$/src/main/resources/application.properties" /> | ||
76 | - <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/user/controller/IndexController.java" /> | ||
77 | - <option value="$PROJECT_DIR$/src/main/java/com/huaheng/HuaHengApplication.java" /> | ||
78 | - <option value="$PROJECT_DIR$/src/main/resources/templates/system/dict/data/data.html" /> | ||
79 | - <option value="$PROJECT_DIR$/src/main/resources/application-druid.properties" /> | ||
80 | - <option value="$PROJECT_DIR$/src/test/java/com.huaheng.test/CreateCode.java" /> | ||
81 | - <option value="$PROJECT_DIR$/pom.xml" /> | ||
82 | - <option value="$PROJECT_DIR$/src/main/resources/templates/index.html" /> | ||
83 | - <option value="$PROJECT_DIR$/src/main/resources/templates/login.html" /> | ||
84 | - </list> | ||
85 | - </option> | ||
86 | - </component> | ||
87 | <component name="IgnoredFileRootStore"> | 74 | <component name="IgnoredFileRootStore"> |
88 | <option name="generatedRoots"> | 75 | <option name="generatedRoots"> |
89 | <set> | 76 | <set> |
@@ -91,201 +78,14 @@ | @@ -91,201 +78,14 @@ | ||
91 | </set> | 78 | </set> |
92 | </option> | 79 | </option> |
93 | </component> | 80 | </component> |
94 | - <component name="MavenImportPreferences"> | ||
95 | - <option name="importingSettings"> | ||
96 | - <MavenImportingSettings> | ||
97 | - <option name="importAutomatically" value="true" /> | ||
98 | - </MavenImportingSettings> | ||
99 | - </option> | ||
100 | - </component> | ||
101 | - <component name="MavenProjectNavigator"> | ||
102 | - <treeState> | ||
103 | - <expand> | ||
104 | - <path> | ||
105 | - <item name="" type="16c1761:MavenProjectsStructure$RootNode" /> | ||
106 | - <item name="huaheng" type="9519ce18:MavenProjectsStructure$ProjectNode" /> | ||
107 | - </path> | ||
108 | - <path> | ||
109 | - <item name="" type="16c1761:MavenProjectsStructure$RootNode" /> | ||
110 | - <item name="huaheng" type="9519ce18:MavenProjectsStructure$ProjectNode" /> | ||
111 | - <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" /> | ||
112 | - </path> | ||
113 | - </expand> | ||
114 | - <select /> | ||
115 | - </treeState> | ||
116 | - </component> | ||
117 | - <component name="MavenRunner"> | ||
118 | - <option name="skipTests" value="true" /> | ||
119 | - </component> | ||
120 | - <component name="ProjectFrameBounds" extendedState="6"> | ||
121 | - <option name="x" value="-10" /> | ||
122 | - <option name="y" value="-10" /> | ||
123 | - <option name="width" value="1940" /> | ||
124 | - <option name="height" value="1100" /> | ||
125 | - </component> | ||
126 | <component name="ProjectId" id="1P5Ngjh73HToCarlEZkqMxrL7pm" /> | 81 | <component name="ProjectId" id="1P5Ngjh73HToCarlEZkqMxrL7pm" /> |
127 | <component name="ProjectLevelVcsManager"> | 82 | <component name="ProjectLevelVcsManager"> |
128 | <ConfirmationsSetting value="2" id="Add" /> | 83 | <ConfirmationsSetting value="2" id="Add" /> |
129 | </component> | 84 | </component> |
130 | - <component name="ProjectView"> | ||
131 | - <navigator proportions="" version="1"> | ||
132 | - <foldersAlwaysOnTop value="true" /> | ||
133 | - </navigator> | ||
134 | - <panes> | ||
135 | - <pane id="Scope" /> | ||
136 | - <pane id="ProjectPane"> | ||
137 | - <subPane> | ||
138 | - <expand> | ||
139 | - <path> | ||
140 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
141 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
142 | - </path> | ||
143 | - <path> | ||
144 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
145 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
146 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
147 | - </path> | ||
148 | - <path> | ||
149 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
150 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
151 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
152 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
153 | - </path> | ||
154 | - <path> | ||
155 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
156 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
157 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
158 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
159 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
160 | - </path> | ||
161 | - <path> | ||
162 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
163 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
164 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
165 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
166 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
167 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
168 | - </path> | ||
169 | - <path> | ||
170 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
171 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
172 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
173 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
174 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
175 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
176 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
177 | - </path> | ||
178 | - <path> | ||
179 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
180 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
181 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
182 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
183 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
184 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
185 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
186 | - <item name="pc" type="462c0819:PsiDirectoryNode" /> | ||
187 | - </path> | ||
188 | - <path> | ||
189 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
190 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
191 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
192 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
193 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
194 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
195 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
196 | - <item name="pc" type="462c0819:PsiDirectoryNode" /> | ||
197 | - <item name="inventory" type="462c0819:PsiDirectoryNode" /> | ||
198 | - </path> | ||
199 | - <path> | ||
200 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
201 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
202 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
203 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
204 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
205 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
206 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
207 | - <item name="pc" type="462c0819:PsiDirectoryNode" /> | ||
208 | - <item name="inventory" type="462c0819:PsiDirectoryNode" /> | ||
209 | - <item name="inventoryDetail" type="462c0819:PsiDirectoryNode" /> | ||
210 | - </path> | ||
211 | - <path> | ||
212 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
213 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
214 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
215 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
216 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
217 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
218 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
219 | - <item name="pc" type="462c0819:PsiDirectoryNode" /> | ||
220 | - <item name="inventory" type="462c0819:PsiDirectoryNode" /> | ||
221 | - <item name="inventoryHeader" type="462c0819:PsiDirectoryNode" /> | ||
222 | - </path> | ||
223 | - <path> | ||
224 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
225 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
226 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
227 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
228 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
229 | - <item name="com" type="462c0819:PsiDirectoryNode" /> | ||
230 | - <item name="huaheng" type="462c0819:PsiDirectoryNode" /> | ||
231 | - <item name="pc" type="462c0819:PsiDirectoryNode" /> | ||
232 | - <item name="inventory" type="462c0819:PsiDirectoryNode" /> | ||
233 | - <item name="inventoryTransaction" type="462c0819:PsiDirectoryNode" /> | ||
234 | - </path> | ||
235 | - <path> | ||
236 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
237 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
238 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
239 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
240 | - <item name="resources" type="462c0819:PsiDirectoryNode" /> | ||
241 | - </path> | ||
242 | - <path> | ||
243 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
244 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
245 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
246 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
247 | - <item name="resources" type="462c0819:PsiDirectoryNode" /> | ||
248 | - <item name="static" type="462c0819:PsiDirectoryNode" /> | ||
249 | - </path> | ||
250 | - <path> | ||
251 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
252 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
253 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
254 | - <item name="main" type="462c0819:PsiDirectoryNode" /> | ||
255 | - <item name="resources" type="462c0819:PsiDirectoryNode" /> | ||
256 | - <item name="templates" type="462c0819:PsiDirectoryNode" /> | ||
257 | - </path> | ||
258 | - <path> | ||
259 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
260 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
261 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
262 | - <item name="test" type="462c0819:PsiDirectoryNode" /> | ||
263 | - </path> | ||
264 | - <path> | ||
265 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
266 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
267 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
268 | - <item name="test" type="462c0819:PsiDirectoryNode" /> | ||
269 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
270 | - </path> | ||
271 | - <path> | ||
272 | - <item name="wms2" type="b2602c69:ProjectViewProjectNode" /> | ||
273 | - <item name="wms2" type="462c0819:PsiDirectoryNode" /> | ||
274 | - <item name="src" type="462c0819:PsiDirectoryNode" /> | ||
275 | - <item name="test" type="462c0819:PsiDirectoryNode" /> | ||
276 | - <item name="java" type="462c0819:PsiDirectoryNode" /> | ||
277 | - <item name="com.huaheng.test" type="462c0819:PsiDirectoryNode" /> | ||
278 | - </path> | ||
279 | - </expand> | ||
280 | - <select /> | ||
281 | - </subPane> | ||
282 | - </pane> | ||
283 | - <pane id="PackagesPane" /> | ||
284 | - </panes> | ||
285 | - </component> | ||
286 | <component name="PropertiesComponent"> | 85 | <component name="PropertiesComponent"> |
287 | <property name="ASKED_ADD_EXTERNAL_FILES" value="true" /> | 86 | <property name="ASKED_ADD_EXTERNAL_FILES" value="true" /> |
288 | <property name="DatabaseDriversLRU" value="mysql" /> | 87 | <property name="DatabaseDriversLRU" value="mysql" /> |
88 | + <property name="DefaultHtmlFileTemplate" value="HTML File" /> | ||
289 | <property name="ExpandSpringBootJavaOptionsPanel" value="true" /> | 89 | <property name="ExpandSpringBootJavaOptionsPanel" value="true" /> |
290 | <property name="RequestMappingsPanelOrder0" value="0" /> | 90 | <property name="RequestMappingsPanelOrder0" value="0" /> |
291 | <property name="RequestMappingsPanelOrder1" value="1" /> | 91 | <property name="RequestMappingsPanelOrder1" value="1" /> |
@@ -294,22 +94,39 @@ | @@ -294,22 +94,39 @@ | ||
294 | <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> | 94 | <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> |
295 | <property name="WebServerToolWindowFactoryState" value="false" /> | 95 | <property name="WebServerToolWindowFactoryState" value="false" /> |
296 | <property name="aspect.path.notification.shown" value="true" /> | 96 | <property name="aspect.path.notification.shown" value="true" /> |
297 | - <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/resources/mybatis" /> | 97 | + <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/resources/mybatis/config" /> |
298 | <property name="node.js.detected.package.eslint" value="true" /> | 98 | <property name="node.js.detected.package.eslint" value="true" /> |
299 | <property name="node.js.detected.package.tslint" value="true" /> | 99 | <property name="node.js.detected.package.tslint" value="true" /> |
300 | <property name="node.js.path.for.package.eslint" value="project" /> | 100 | <property name="node.js.path.for.package.eslint" value="project" /> |
301 | <property name="node.js.path.for.package.tslint" value="project" /> | 101 | <property name="node.js.path.for.package.tslint" value="project" /> |
302 | <property name="node.js.selected.package.eslint" value="(autodetect)" /> | 102 | <property name="node.js.selected.package.eslint" value="(autodetect)" /> |
303 | <property name="node.js.selected.package.tslint" value="(autodetect)" /> | 103 | <property name="node.js.selected.package.tslint" value="(autodetect)" /> |
304 | - <property name="settings.editor.selected.configurable" value="preferences.pluginManager" /> | 104 | + <property name="nodejs_package_manager_path" value="npm" /> |
105 | + <property name="project.structure.last.edited" value="Project" /> | ||
106 | + <property name="project.structure.proportion" value="0.0" /> | ||
107 | + <property name="project.structure.side.proportion" value="0.0" /> | ||
108 | + <property name="settings.editor.selected.configurable" value="File.Encoding" /> | ||
305 | </component> | 109 | </component> |
306 | <component name="RecentsManager"> | 110 | <component name="RecentsManager"> |
307 | <key name="MoveFile.RECENT_KEYS"> | 111 | <key name="MoveFile.RECENT_KEYS"> |
112 | + <recent name="E:\code\wms2\src\main\resources\templates\general\carrier" /> | ||
308 | <recent name="E:\code\wms2\src\main\resources\mybatis\general" /> | 113 | <recent name="E:\code\wms2\src\main\resources\mybatis\general" /> |
309 | <recent name="E:\code\wms2\src\main\resources\mybatis\config" /> | 114 | <recent name="E:\code\wms2\src\main\resources\mybatis\config" /> |
310 | </key> | 115 | </key> |
116 | + <key name="CopyFile.RECENT_KEYS"> | ||
117 | + <recent name="E:\code\wms2\src\main\resources\mybatis\config" /> | ||
118 | + <recent name="E:\code\wms2\src\main\java\com\huaheng\pc\config" /> | ||
119 | + <recent name="E:\code\wms2\src\main\resources\static\ajax\libs\layui\lay\modules" /> | ||
120 | + <recent name="E:\code\wms2\target\classes\static\file" /> | ||
121 | + <recent name="E:\code\wms2\src\main\resources\static\file" /> | ||
122 | + </key> | ||
311 | </component> | 123 | </component> |
312 | <component name="RunDashboard"> | 124 | <component name="RunDashboard"> |
125 | + <option name="configurationTypes"> | ||
126 | + <set> | ||
127 | + <option value="SpringBootApplicationConfigurationType" /> | ||
128 | + </set> | ||
129 | + </option> | ||
313 | <option name="ruleStates"> | 130 | <option name="ruleStates"> |
314 | <list> | 131 | <list> |
315 | <RuleState> | 132 | <RuleState> |
@@ -323,10 +140,9 @@ | @@ -323,10 +140,9 @@ | ||
323 | </component> | 140 | </component> |
324 | <component name="RunManager"> | 141 | <component name="RunManager"> |
325 | <configuration name="HuaHengApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot"> | 142 | <configuration name="HuaHengApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot"> |
326 | - <module name="wms2" /> | 143 | + <module name="huaheng" /> |
327 | <option name="SPRING_BOOT_MAIN_CLASS" value="com.huaheng.HuaHengApplication" /> | 144 | <option name="SPRING_BOOT_MAIN_CLASS" value="com.huaheng.HuaHengApplication" /> |
328 | - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" /> | ||
329 | - <option name="ALTERNATIVE_JRE_PATH" value="C:\Program Files\Java\jdk1.8.0_202\jre" /> | 145 | + <option name="ALTERNATIVE_JRE_PATH" /> |
330 | <option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" /> | 146 | <option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" /> |
331 | <option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" /> | 147 | <option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" /> |
332 | <method v="2"> | 148 | <method v="2"> |
@@ -345,8 +161,18 @@ | @@ -345,8 +161,18 @@ | ||
345 | <component name="ServiceViewManager"> | 161 | <component name="ServiceViewManager"> |
346 | <option name="allServicesViewState"> | 162 | <option name="allServicesViewState"> |
347 | <serviceView> | 163 | <serviceView> |
164 | + <option name="contentProportion" value="0.18875067" /> | ||
348 | <treeState> | 165 | <treeState> |
349 | - <expand /> | 166 | + <expand> |
167 | + <path> | ||
168 | + <item name="services root" type="e789fda9:ObjectUtils$Sentinel" /> | ||
169 | + <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@5ef312b7" type="7427dc5b:ServiceModel$ServiceGroupNode" /> | ||
170 | + </path> | ||
171 | + <path> | ||
172 | + <item name="services root" type="e789fda9:ObjectUtils$Sentinel" /> | ||
173 | + <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@28150ae" type="7427dc5b:ServiceModel$ServiceGroupNode" /> | ||
174 | + </path> | ||
175 | + </expand> | ||
350 | <select /> | 176 | <select /> |
351 | </treeState> | 177 | </treeState> |
352 | </serviceView> | 178 | </serviceView> |
@@ -369,7 +195,22 @@ | @@ -369,7 +195,22 @@ | ||
369 | <workItem from="1565311988064" duration="7176000" /> | 195 | <workItem from="1565311988064" duration="7176000" /> |
370 | <workItem from="1565328536669" duration="797000" /> | 196 | <workItem from="1565328536669" duration="797000" /> |
371 | <workItem from="1565345715376" duration="452000" /> | 197 | <workItem from="1565345715376" duration="452000" /> |
372 | - <workItem from="1565570424829" duration="697000" /> | 198 | + <workItem from="1565570424829" duration="11663000" /> |
199 | + <workItem from="1565587737758" duration="12961000" /> | ||
200 | + <workItem from="1565657307503" duration="115000" /> | ||
201 | + <workItem from="1565657439247" duration="2447000" /> | ||
202 | + <workItem from="1565662229227" duration="20296000" /> | ||
203 | + <workItem from="1565691345079" duration="6000" /> | ||
204 | + <workItem from="1565743087352" duration="10121000" /> | ||
205 | + <workItem from="1565760941070" duration="6738000" /> | ||
206 | + <workItem from="1565768341327" duration="2970000" /> | ||
207 | + <workItem from="1565771864886" duration="599000" /> | ||
208 | + <workItem from="1565772469694" duration="23000" /> | ||
209 | + <workItem from="1565772518459" duration="4348000" /> | ||
210 | + <workItem from="1565829438280" duration="3502000" /> | ||
211 | + <workItem from="1565832950552" duration="86000" /> | ||
212 | + <workItem from="1565833039573" duration="288000" /> | ||
213 | + <workItem from="1565833342181" duration="13946000" /> | ||
373 | </task> | 214 | </task> |
374 | <task id="LOCAL-00001" summary="添加库位、库位类型增删改查接口"> | 215 | <task id="LOCAL-00001" summary="添加库位、库位类型增删改查接口"> |
375 | <created>1565226427512</created> | 216 | <created>1565226427512</created> |
@@ -399,49 +240,72 @@ | @@ -399,49 +240,72 @@ | ||
399 | <option name="project" value="LOCAL" /> | 240 | <option name="project" value="LOCAL" /> |
400 | <updated>1565342188814</updated> | 241 | <updated>1565342188814</updated> |
401 | </task> | 242 | </task> |
402 | - <option name="localTasksCounter" value="5" /> | 243 | + <task id="LOCAL-00005" summary="添加userWarehouse"> |
244 | + <created>1565571202923</created> | ||
245 | + <option name="number" value="00005" /> | ||
246 | + <option name="presentableId" value="LOCAL-00005" /> | ||
247 | + <option name="project" value="LOCAL" /> | ||
248 | + <updated>1565571202923</updated> | ||
249 | + </task> | ||
250 | + <task id="LOCAL-00006" summary="添加containerCapacity"> | ||
251 | + <created>1565578920011</created> | ||
252 | + <option name="number" value="00006" /> | ||
253 | + <option name="presentableId" value="LOCAL-00006" /> | ||
254 | + <option name="project" value="LOCAL" /> | ||
255 | + <updated>1565578920011</updated> | ||
256 | + </task> | ||
257 | + <task id="LOCAL-00007" summary="添加物料页面"> | ||
258 | + <created>1565593159103</created> | ||
259 | + <option name="number" value="00007" /> | ||
260 | + <option name="presentableId" value="LOCAL-00007" /> | ||
261 | + <option name="project" value="LOCAL" /> | ||
262 | + <updated>1565593159103</updated> | ||
263 | + </task> | ||
264 | + <task id="LOCAL-00008" summary="添加商品详情"> | ||
265 | + <created>1565598117104</created> | ||
266 | + <option name="number" value="00008" /> | ||
267 | + <option name="presentableId" value="LOCAL-00008" /> | ||
268 | + <option name="project" value="LOCAL" /> | ||
269 | + <updated>1565598117104</updated> | ||
270 | + </task> | ||
271 | + <task id="LOCAL-00009" summary="添加物料时判断单位是否存在,不存在则添加物料单位"> | ||
272 | + <created>1565659672152</created> | ||
273 | + <option name="number" value="00009" /> | ||
274 | + <option name="presentableId" value="LOCAL-00009" /> | ||
275 | + <option name="project" value="LOCAL" /> | ||
276 | + <updated>1565659672152</updated> | ||
277 | + </task> | ||
278 | + <task id="LOCAL-00010" summary="添加task实体类"> | ||
279 | + <created>1565665525508</created> | ||
280 | + <option name="number" value="00010" /> | ||
281 | + <option name="presentableId" value="LOCAL-00010" /> | ||
282 | + <option name="project" value="LOCAL" /> | ||
283 | + <updated>1565665525508</updated> | ||
284 | + </task> | ||
285 | + <task id="LOCAL-00011" summary="添加商品、商品详情页面"> | ||
286 | + <created>1565686619774</created> | ||
287 | + <option name="number" value="00011" /> | ||
288 | + <option name="presentableId" value="LOCAL-00011" /> | ||
289 | + <option name="project" value="LOCAL" /> | ||
290 | + <updated>1565686619774</updated> | ||
291 | + </task> | ||
292 | + <task id="LOCAL-00012" summary="添加承运商"> | ||
293 | + <created>1565745258070</created> | ||
294 | + <option name="number" value="00012" /> | ||
295 | + <option name="presentableId" value="LOCAL-00012" /> | ||
296 | + <option name="project" value="LOCAL" /> | ||
297 | + <updated>1565745258070</updated> | ||
298 | + </task> | ||
299 | + <task id="LOCAL-00013" summary="添加物料导入、导出模板,添加Excel导入导出配置文件"> | ||
300 | + <created>1565833218584</created> | ||
301 | + <option name="number" value="00013" /> | ||
302 | + <option name="presentableId" value="LOCAL-00013" /> | ||
303 | + <option name="project" value="LOCAL" /> | ||
304 | + <updated>1565833218584</updated> | ||
305 | + </task> | ||
306 | + <option name="localTasksCounter" value="14" /> | ||
403 | <servers /> | 307 | <servers /> |
404 | </component> | 308 | </component> |
405 | - <component name="ToolWindowManager"> | ||
406 | - <frame x="-7" y="-7" width="1550" height="838" extended-state="6" /> | ||
407 | - <editor active="true" /> | ||
408 | - <layout> | ||
409 | - <window_info content_ui="combo" id="Project" order="0" sideWeight="0.4967462" visible="true" weight="0.28820375" /> | ||
410 | - <window_info id="Structure" order="1" sideWeight="0.5032538" side_tool="true" weight="0.1673774" /> | ||
411 | - <window_info id="Designer" order="2" /> | ||
412 | - <window_info id="UI Designer" order="3" /> | ||
413 | - <window_info id="Favorites" order="4" side_tool="true" /> | ||
414 | - <window_info id="Capture Tool" order="5" /> | ||
415 | - <window_info id="Web" order="6" side_tool="true" /> | ||
416 | - <window_info id="Image Layers" order="7" /> | ||
417 | - <window_info anchor="bottom" id="Message" order="0" /> | ||
418 | - <window_info anchor="bottom" id="Find" order="1" /> | ||
419 | - <window_info anchor="bottom" id="Run" order="2" /> | ||
420 | - <window_info active="true" anchor="bottom" id="Debug" order="3" visible="true" weight="0.2407932" /> | ||
421 | - <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> | ||
422 | - <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> | ||
423 | - <window_info anchor="bottom" id="TODO" order="6" /> | ||
424 | - <window_info anchor="bottom" id="Spring" order="7" /> | ||
425 | - <window_info anchor="bottom" id="Terminal" order="8" /> | ||
426 | - <window_info anchor="bottom" id="Event Log" order="9" side_tool="true" /> | ||
427 | - <window_info anchor="bottom" id="Java Enterprise" order="10" weight="0.3286119" /> | ||
428 | - <window_info anchor="bottom" id="Database Changes" order="11" /> | ||
429 | - <window_info anchor="bottom" id="Version Control" order="12" weight="0.8427762" /> | ||
430 | - <window_info anchor="bottom" id="Docker" order="13" show_stripe_button="false" /> | ||
431 | - <window_info anchor="bottom" id="Messages" order="14" weight="0.329718" /> | ||
432 | - <window_info anchor="bottom" id="MyBatis Log" order="15" /> | ||
433 | - <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" /> | ||
434 | - <window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> | ||
435 | - <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> | ||
436 | - <window_info anchor="right" id="Maven" order="3" weight="0.22334754" /> | ||
437 | - <window_info anchor="right" id="Palette" order="4" /> | ||
438 | - <window_info anchor="right" id="Capture Analysis" order="5" /> | ||
439 | - <window_info anchor="right" id="Database" order="6" weight="0.32995737" /> | ||
440 | - <window_info anchor="right" id="Palette	" order="7" /> | ||
441 | - <window_info anchor="right" id="Theme Preview" order="8" /> | ||
442 | - <window_info anchor="right" id="Bean Validation" order="9" weight="0.32995737" /> | ||
443 | - </layout> | ||
444 | - </component> | ||
445 | <component name="TypeScriptGeneratedFilesManager"> | 309 | <component name="TypeScriptGeneratedFilesManager"> |
446 | <option name="version" value="1" /> | 310 | <option name="version" value="1" /> |
447 | </component> | 311 | </component> |
@@ -451,20 +315,7 @@ | @@ -451,20 +315,7 @@ | ||
451 | <entry key="MAIN"> | 315 | <entry key="MAIN"> |
452 | <value> | 316 | <value> |
453 | <State> | 317 | <State> |
454 | - <option name="RECENTLY_FILTERED_USER_GROUPS"> | ||
455 | - <collection /> | ||
456 | - </option> | ||
457 | - <option name="RECENTLY_FILTERED_BRANCH_GROUPS"> | ||
458 | - <collection /> | ||
459 | - </option> | ||
460 | - <option name="COLUMN_ORDER"> | ||
461 | - <list> | ||
462 | - <option value="0" /> | ||
463 | - <option value="1" /> | ||
464 | - <option value="2" /> | ||
465 | - <option value="3" /> | ||
466 | - </list> | ||
467 | - </option> | 318 | + <option name="COLUMN_ORDER" /> |
468 | </State> | 319 | </State> |
469 | </value> | 320 | </value> |
470 | </entry> | 321 | </entry> |
@@ -490,168 +341,44 @@ | @@ -490,168 +341,44 @@ | ||
490 | <MESSAGE value="添加入库、出库表实体类 添加客户、供应商增删改查接口 添加库位、容器、供应商页面" /> | 341 | <MESSAGE value="添加入库、出库表实体类 添加客户、供应商增删改查接口 添加库位、容器、供应商页面" /> |
491 | <MESSAGE value="修改库区service" /> | 342 | <MESSAGE value="修改库区service" /> |
492 | <MESSAGE value="Merge branch 'develop' of http://172.16.29.40:8010/wms/wms2 into develop # Conflicts: #	.idea/workspace.xml" /> | 343 | <MESSAGE value="Merge branch 'develop' of http://172.16.29.40:8010/wms/wms2 into develop # Conflicts: #	.idea/workspace.xml" /> |
493 | - <MESSAGE value="配置文件更新修改" /> | ||
494 | - <MESSAGE value="修复页面字典明细报错" /> | ||
495 | - <MESSAGE value="更新json库和druid的jar包" /> | ||
496 | - <option name="LAST_COMMIT_MESSAGE" value="更新json库和druid的jar包" /> | 344 | + <MESSAGE value="添加userWarehouse" /> |
345 | + <MESSAGE value="添加containerCapacity" /> | ||
346 | + <MESSAGE value="添加物料页面" /> | ||
347 | + <MESSAGE value="添加商品详情" /> | ||
348 | + <MESSAGE value="添加物料时判断单位是否存在,不存在则添加物料单位" /> | ||
349 | + <MESSAGE value="添加task实体类" /> | ||
350 | + <MESSAGE value="添加商品、商品详情页面" /> | ||
351 | + <MESSAGE value="添加承运商" /> | ||
352 | + <MESSAGE value="添加物料导入、导出模板,添加Excel导入导出配置文件" /> | ||
353 | + <option name="LAST_COMMIT_MESSAGE" value="添加物料导入、导出模板,添加Excel导入导出配置文件" /> | ||
497 | </component> | 354 | </component> |
498 | <component name="XDebuggerManager"> | 355 | <component name="XDebuggerManager"> |
499 | <breakpoint-manager> | 356 | <breakpoint-manager> |
500 | <breakpoints> | 357 | <breakpoints> |
501 | <line-breakpoint enabled="true" type="java-line"> | 358 | <line-breakpoint enabled="true" type="java-line"> |
502 | <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/general/material/controller/MaterialController.java</url> | 359 | <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/general/material/controller/MaterialController.java</url> |
503 | - <line>78</line> | ||
504 | - <properties /> | ||
505 | - <option name="timeStamp" value="1" /> | 360 | + <line>198</line> |
361 | + <option name="timeStamp" value="11" /> | ||
362 | + </line-breakpoint> | ||
363 | + <line-breakpoint enabled="true" type="java-line"> | ||
364 | + <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/common/utils/poi/ExcelUtil.java</url> | ||
365 | + <line>302</line> | ||
366 | + <option name="timeStamp" value="12" /> | ||
367 | + </line-breakpoint> | ||
368 | + <line-breakpoint enabled="true" type="java-line"> | ||
369 | + <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/general/material/controller/MaterialController.java</url> | ||
370 | + <line>187</line> | ||
371 | + <option name="timeStamp" value="16" /> | ||
372 | + </line-breakpoint> | ||
373 | + <line-breakpoint enabled="true" type="java-line"> | ||
374 | + <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/general/material/service/MaterialServiceImpl.java</url> | ||
375 | + <line>66</line> | ||
376 | + <option name="timeStamp" value="24" /> | ||
506 | </line-breakpoint> | 377 | </line-breakpoint> |
507 | </breakpoints> | 378 | </breakpoints> |
508 | </breakpoint-manager> | 379 | </breakpoint-manager> |
509 | </component> | 380 | </component> |
510 | - <component name="editorHistoryManager"> | ||
511 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/common/redis/RedisConfig.java" /> | ||
512 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/HuaHengServletInitializer.java"> | ||
513 | - <provider selected="true" editor-type-id="text-editor"> | ||
514 | - <state relative-caret-position="180"> | ||
515 | - <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" /> | ||
516 | - </state> | ||
517 | - </provider> | ||
518 | - </entry> | ||
519 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/common/redis/serviceimpl/RedisServiceImpl.java" /> | ||
520 | - <entry file="file://$PROJECT_DIR$/src/main/resources/application.properties"> | ||
521 | - <provider selected="true" editor-type-id="text-editor"> | ||
522 | - <state relative-caret-position="-272"> | ||
523 | - <caret line="17" column="17" selection-start-line="17" selection-start-column="17" selection-end-line="17" selection-end-column="17" /> | ||
524 | - </state> | ||
525 | - </provider> | ||
526 | - </entry> | ||
527 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/report/excelReport/service/ExcelReportService.java"> | ||
528 | - <provider selected="true" editor-type-id="text-editor" /> | ||
529 | - </entry> | ||
530 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/user/domain/User.java"> | ||
531 | - <provider selected="true" editor-type-id="text-editor"> | ||
532 | - <state relative-caret-position="113"> | ||
533 | - <caret line="147" column="39" selection-start-line="147" selection-start-column="39" selection-end-line="147" selection-end-column="39" /> | ||
534 | - <folding> | ||
535 | - <element signature="e#3376#3377#0" expanded="true" /> | ||
536 | - <element signature="e#3415#3416#0" expanded="true" /> | ||
537 | - </folding> | ||
538 | - </state> | ||
539 | - </provider> | ||
540 | - </entry> | ||
541 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/user/controller/IndexController.java"> | ||
542 | - <provider selected="true" editor-type-id="text-editor"> | ||
543 | - <state relative-caret-position="372"> | ||
544 | - <caret line="311" column="16" selection-start-line="311" selection-start-column="16" selection-end-line="311" selection-end-column="16" /> | ||
545 | - <folding> | ||
546 | - <element signature="imports" expanded="true" /> | ||
547 | - </folding> | ||
548 | - </state> | ||
549 | - </provider> | ||
550 | - </entry> | ||
551 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/system/dict/data/data.html"> | ||
552 | - <provider selected="true" editor-type-id="text-editor"> | ||
553 | - <state relative-caret-position="2980"> | ||
554 | - <caret line="149" column="10" selection-start-line="149" selection-start-column="10" selection-end-line="149" selection-end-column="10" /> | ||
555 | - </state> | ||
556 | - </provider> | ||
557 | - </entry> | ||
558 | - <entry file="file://$PROJECT_DIR$/src/test/java/com.huaheng.test/CreateCode.java"> | ||
559 | - <provider selected="true" editor-type-id="text-editor"> | ||
560 | - <state relative-caret-position="368"> | ||
561 | - <caret line="1054" column="29" lean-forward="true" selection-start-line="1054" selection-start-column="29" selection-end-line="1054" selection-end-column="29" /> | ||
562 | - </state> | ||
563 | - </provider> | ||
564 | - </entry> | ||
565 | - <entry file="file://$PROJECT_DIR$/src/test/java/com.huaheng.test/EncryptPassword.java"> | ||
566 | - <provider selected="true" editor-type-id="text-editor"> | ||
567 | - <state relative-caret-position="240"> | ||
568 | - <caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" /> | ||
569 | - </state> | ||
570 | - </provider> | ||
571 | - </entry> | ||
572 | - <entry file="file://$PROJECT_DIR$/src/main/resources/application-druid.properties"> | ||
573 | - <provider selected="true" editor-type-id="text-editor"> | ||
574 | - <state relative-caret-position="160"> | ||
575 | - <caret line="8" column="70" selection-start-line="8" selection-start-column="70" selection-end-line="8" selection-end-column="70" /> | ||
576 | - </state> | ||
577 | - </provider> | ||
578 | - </entry> | ||
579 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/HuaHengApplication.java"> | ||
580 | - <provider selected="true" editor-type-id="text-editor"> | ||
581 | - <state relative-caret-position="88"> | ||
582 | - <caret line="11" column="3" selection-start-line="11" selection-start-column="3" selection-end-line="11" selection-end-column="3" /> | ||
583 | - </state> | ||
584 | - </provider> | ||
585 | - </entry> | ||
586 | - <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryDetail/domain/InventoryDetail.java"> | ||
587 | - <provider selected="true" editor-type-id="text-editor"> | ||
588 | - <state relative-caret-position="120"> | ||
589 | - <caret line="12" column="13" selection-start-line="12" selection-start-column="13" selection-end-line="12" selection-end-column="13" /> | ||
590 | - </state> | ||
591 | - </provider> | ||
592 | - </entry> | ||
593 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/include.html"> | ||
594 | - <provider selected="true" editor-type-id="text-editor" /> | ||
595 | - </entry> | ||
596 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/main.html"> | ||
597 | - <provider selected="true" editor-type-id="text-editor"> | ||
598 | - <state relative-caret-position="-1548" /> | ||
599 | - </provider> | ||
600 | - </entry> | ||
601 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/index.html"> | ||
602 | - <provider selected="true" editor-type-id="text-editor"> | ||
603 | - <state relative-caret-position="-526"> | ||
604 | - <caret line="8" column="43" selection-start-line="8" selection-start-column="43" selection-end-line="8" selection-end-column="43" /> | ||
605 | - </state> | ||
606 | - </provider> | ||
607 | - </entry> | ||
608 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/favicon.ico"> | ||
609 | - <provider selected="true" editor-type-id="images" /> | ||
610 | - </entry> | ||
611 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/huaheng.png"> | ||
612 | - <provider selected="true" editor-type-id="images" /> | ||
613 | - </entry> | ||
614 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/user.png"> | ||
615 | - <provider selected="true" editor-type-id="images" /> | ||
616 | - </entry> | ||
617 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/locked.png"> | ||
618 | - <provider selected="true" editor-type-id="images" /> | ||
619 | - </entry> | ||
620 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/progress.png"> | ||
621 | - <provider selected="true" editor-type-id="images" /> | ||
622 | - </entry> | ||
623 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/loading.gif"> | ||
624 | - <provider selected="true" editor-type-id="images" /> | ||
625 | - </entry> | ||
626 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/sprite-skin-flat.png"> | ||
627 | - <provider selected="true" editor-type-id="images" /> | ||
628 | - </entry> | ||
629 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/qr_code.png"> | ||
630 | - <provider selected="true" editor-type-id="images" /> | ||
631 | - </entry> | ||
632 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/profile.jpg"> | ||
633 | - <provider selected="true" editor-type-id="images" /> | ||
634 | - </entry> | ||
635 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/bg.png"> | ||
636 | - <provider selected="true" editor-type-id="images" /> | ||
637 | - </entry> | ||
638 | - <entry file="file://$PROJECT_DIR$/src/main/resources/static/img/webuploader.png"> | ||
639 | - <provider selected="true" editor-type-id="images" /> | ||
640 | - </entry> | ||
641 | - <entry file="file://$PROJECT_DIR$/pom.xml"> | ||
642 | - <provider selected="true" editor-type-id="text-editor"> | ||
643 | - <state relative-caret-position="248"> | ||
644 | - <caret line="16" column="40" selection-start-line="16" selection-start-column="40" selection-end-line="16" selection-end-column="40" /> | ||
645 | - </state> | ||
646 | - </provider> | ||
647 | - <provider editor-type-id="MavenHelperPluginDependencyAnalyzer" /> | ||
648 | - </entry> | ||
649 | - <entry file="file://$PROJECT_DIR$/src/main/resources/templates/login.html"> | ||
650 | - <provider selected="true" editor-type-id="text-editor"> | ||
651 | - <state relative-caret-position="289"> | ||
652 | - <caret line="40" column="24" selection-start-line="40" selection-start-column="24" selection-end-line="40" selection-end-column="24" /> | ||
653 | - </state> | ||
654 | - </provider> | ||
655 | - </entry> | 381 | + <component name="com.intellij.coverage.CoverageDataManagerImpl"> |
382 | + <SUITE FILE_PATH="coverage/wmsv2$HuaHengApplication.ic" NAME="HuaHengApplication Coverage Results" MODIFIED="1565752188059" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="idea" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" /> | ||
656 | </component> | 383 | </component> |
657 | </project> | 384 | </project> |
658 | \ No newline at end of file | 385 | \ No newline at end of file |
pom.xml
@@ -246,7 +246,7 @@ | @@ -246,7 +246,7 @@ | ||
246 | <dependency> | 246 | <dependency> |
247 | <groupId>org.apache.poi</groupId> | 247 | <groupId>org.apache.poi</groupId> |
248 | <artifactId>poi-ooxml</artifactId> | 248 | <artifactId>poi-ooxml</artifactId> |
249 | - <version>3.9</version> | 249 | + <version>3.17</version> |
250 | </dependency> | 250 | </dependency> |
251 | 251 | ||
252 | <!--activiti工作流--> | 252 | <!--activiti工作流--> |
@@ -337,6 +337,12 @@ | @@ -337,6 +337,12 @@ | ||
337 | <artifactId>mybatis-plus-annotation</artifactId> | 337 | <artifactId>mybatis-plus-annotation</artifactId> |
338 | <version>3.1.2</version> | 338 | <version>3.1.2</version> |
339 | </dependency> | 339 | </dependency> |
340 | + | ||
341 | + <!-- yml解析器 --> | ||
342 | + <dependency> | ||
343 | + <groupId>org.yaml</groupId> | ||
344 | + <artifactId>snakeyaml</artifactId> | ||
345 | + </dependency> | ||
340 | </dependencies> | 346 | </dependencies> |
341 | 347 | ||
342 | <build> | 348 | <build> |
src/main/java/com/huaheng/common/annotation/Excels.java
0 → 100644
1 | +package com.huaheng.common.annotation; | ||
2 | + | ||
3 | +import com.huaheng.framework.aspectj.lang.annotation.Excel; | ||
4 | + | ||
5 | +import java.lang.annotation.ElementType; | ||
6 | +import java.lang.annotation.Retention; | ||
7 | +import java.lang.annotation.RetentionPolicy; | ||
8 | +import java.lang.annotation.Target; | ||
9 | + | ||
10 | +/** | ||
11 | + * Excel注解集 | ||
12 | + * | ||
13 | + * @author ruoyi | ||
14 | + */ | ||
15 | +@Target(ElementType.FIELD) | ||
16 | +@Retention(RetentionPolicy.RUNTIME) | ||
17 | +public @interface Excels | ||
18 | +{ | ||
19 | + Excel[] value(); | ||
20 | +} |
src/main/java/com/huaheng/common/config/Global.java
0 → 100644
1 | +package com.huaheng.common.config; | ||
2 | + | ||
3 | +import java.io.FileNotFoundException; | ||
4 | +import java.util.HashMap; | ||
5 | +import java.util.Map; | ||
6 | + | ||
7 | +import com.huaheng.common.utils.StringUtils; | ||
8 | +import org.slf4j.Logger; | ||
9 | +import org.slf4j.LoggerFactory; | ||
10 | + | ||
11 | +import com.ruoyi.common.utils.YamlUtil; | ||
12 | + | ||
13 | +/** | ||
14 | + * 全局配置类 | ||
15 | + * | ||
16 | + * @author ruoyi | ||
17 | + */ | ||
18 | +public class Global | ||
19 | +{ | ||
20 | + private static final Logger log = LoggerFactory.getLogger(Global.class); | ||
21 | + | ||
22 | + private static String NAME = "application.yml"; | ||
23 | + | ||
24 | + /** | ||
25 | + * 当前对象实例 | ||
26 | + */ | ||
27 | + private static Global global; | ||
28 | + | ||
29 | + /** | ||
30 | + * 保存全局属性值 | ||
31 | + */ | ||
32 | + private static Map<String, String> map = new HashMap<String, String>(); | ||
33 | + | ||
34 | + private Global() | ||
35 | + { | ||
36 | + } | ||
37 | + | ||
38 | + /** | ||
39 | + * 静态工厂方法 | ||
40 | + */ | ||
41 | + public static synchronized Global getInstance() | ||
42 | + { | ||
43 | + if (global == null) | ||
44 | + { | ||
45 | + global = new Global(); | ||
46 | + } | ||
47 | + return global; | ||
48 | + } | ||
49 | + | ||
50 | + /** | ||
51 | + * 获取配置 | ||
52 | + */ | ||
53 | + public static String getConfig(String key) | ||
54 | + { | ||
55 | + String value = map.get(key); | ||
56 | + if (value == null) | ||
57 | + { | ||
58 | + Map<?, ?> yamlMap = null; | ||
59 | + try | ||
60 | + { | ||
61 | + yamlMap = YamlUtil.loadYaml(NAME); | ||
62 | + value = String.valueOf(YamlUtil.getProperty(yamlMap, key)); | ||
63 | + map.put(key, value != null ? value : StringUtils.EMPTY); | ||
64 | + } | ||
65 | + catch (FileNotFoundException e) | ||
66 | + { | ||
67 | + log.error("获取全局配置异常 {}", key); | ||
68 | + } | ||
69 | + } | ||
70 | + return value; | ||
71 | + } | ||
72 | + | ||
73 | + /** | ||
74 | + * 获取项目名称 | ||
75 | + */ | ||
76 | + public static String getName() | ||
77 | + { | ||
78 | + return StringUtils.nvl(getConfig("huaheng.name"), "RuoYi"); | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * 获取项目版本 | ||
83 | + */ | ||
84 | + public static String getVersion() | ||
85 | + { | ||
86 | + return StringUtils.nvl(getConfig("huaheng.version"), "4.0.0"); | ||
87 | + } | ||
88 | + | ||
89 | + /** | ||
90 | + * 获取版权年份 | ||
91 | + */ | ||
92 | + public static String getCopyrightYear() | ||
93 | + { | ||
94 | + return StringUtils.nvl(getConfig("huaheng.copyrightYear"), "2019"); | ||
95 | + } | ||
96 | + | ||
97 | + /** | ||
98 | + * 实例演示开关 | ||
99 | + */ | ||
100 | + public static String isDemoEnabled() | ||
101 | + { | ||
102 | + return StringUtils.nvl(getConfig("huaheng.demoEnabled"), "true"); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * 获取ip地址开关 | ||
107 | + */ | ||
108 | + public static Boolean isAddressEnabled() | ||
109 | + { | ||
110 | + return Boolean.valueOf(getConfig("huaheng.addressEnabled")); | ||
111 | + } | ||
112 | + | ||
113 | + /** | ||
114 | + * 获取文件上传路径 | ||
115 | + */ | ||
116 | + public static String getProfile() | ||
117 | + { | ||
118 | + return getConfig("huaheng.profile"); | ||
119 | + } | ||
120 | + | ||
121 | + /** | ||
122 | + * 获取头像上传路径 | ||
123 | + */ | ||
124 | + public static String getAvatarPath() | ||
125 | + { | ||
126 | + return getProfile() + "/avatar"; | ||
127 | + } | ||
128 | + | ||
129 | + /** | ||
130 | + * 获取下载路径 | ||
131 | + */ | ||
132 | + public static String getDownloadPath() | ||
133 | + { | ||
134 | + return getProfile() + "/download"; | ||
135 | + } | ||
136 | + | ||
137 | + /** | ||
138 | + * 获取上传路径 | ||
139 | + */ | ||
140 | + public static String getUploadPath() | ||
141 | + { | ||
142 | + return getProfile() + "/upload"; | ||
143 | + } | ||
144 | +} |
src/main/java/com/huaheng/common/exception/BusinessException.java
0 → 100644
1 | +package com.huaheng.common.exception; | ||
2 | + | ||
3 | +/** | ||
4 | + * 业务异常 | ||
5 | + * | ||
6 | + * @author huaheng | ||
7 | + */ | ||
8 | +public class BusinessException extends RuntimeException{ | ||
9 | + private static final long serialVersionUID = 1L; | ||
10 | + | ||
11 | + protected final String message; | ||
12 | + | ||
13 | + public BusinessException(String message) { | ||
14 | + this.message = message; | ||
15 | + } | ||
16 | + | ||
17 | + @Override | ||
18 | + public String getMessage() { | ||
19 | + return message; | ||
20 | + } | ||
21 | +} |
src/main/java/com/huaheng/common/utils/DateUtils.java
@@ -10,7 +10,7 @@ import org.apache.commons.lang3.time.DateFormatUtils; | @@ -10,7 +10,7 @@ import org.apache.commons.lang3.time.DateFormatUtils; | ||
10 | * | 10 | * |
11 | * @author huaheng | 11 | * @author huaheng |
12 | */ | 12 | */ |
13 | -public class DateUtils | 13 | +public class DateUtils extends org.apache.commons.lang3.time.DateUtils |
14 | { | 14 | { |
15 | public static String YYYY = "yyyy"; | 15 | public static String YYYY = "yyyy"; |
16 | 16 | ||
@@ -22,6 +22,11 @@ public class DateUtils | @@ -22,6 +22,11 @@ public class DateUtils | ||
22 | 22 | ||
23 | public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; | 23 | public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; |
24 | 24 | ||
25 | + private static String[] parsePatterns = { | ||
26 | + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", | ||
27 | + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", | ||
28 | + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; | ||
29 | + | ||
25 | /** | 30 | /** |
26 | * 获取当前Date型日期 | 31 | * 获取当前Date型日期 |
27 | * | 32 | * |
@@ -97,4 +102,23 @@ public class DateUtils | @@ -97,4 +102,23 @@ public class DateUtils | ||
97 | return DateFormatUtils.format(now, "yyyyMMdd"); | 102 | return DateFormatUtils.format(now, "yyyyMMdd"); |
98 | } | 103 | } |
99 | 104 | ||
105 | + /** | ||
106 | + * 日期型字符串转化为日期 格式 | ||
107 | + */ | ||
108 | + public static Date parseDate(Object str) | ||
109 | + { | ||
110 | + if (str == null) | ||
111 | + { | ||
112 | + return null; | ||
113 | + } | ||
114 | + try | ||
115 | + { | ||
116 | + return parseDate(str.toString(), parsePatterns); | ||
117 | + } | ||
118 | + catch (ParseException e) | ||
119 | + { | ||
120 | + return null; | ||
121 | + } | ||
122 | + } | ||
123 | + | ||
100 | } | 124 | } |
src/main/java/com/huaheng/common/utils/YamlUtil.java
0 → 100644
1 | +package com.ruoyi.common.utils; | ||
2 | + | ||
3 | +import java.io.FileNotFoundException; | ||
4 | +import java.io.FileWriter; | ||
5 | +import java.io.IOException; | ||
6 | +import java.io.InputStream; | ||
7 | +import java.util.LinkedHashMap; | ||
8 | +import java.util.Map; | ||
9 | +import org.yaml.snakeyaml.DumperOptions; | ||
10 | +import org.yaml.snakeyaml.Yaml; | ||
11 | +import com.huaheng.common.utils.StringUtils; | ||
12 | + | ||
13 | +/** | ||
14 | + * 配置处理工具类 | ||
15 | + * | ||
16 | + * @author yml | ||
17 | + */ | ||
18 | +public class YamlUtil | ||
19 | +{ | ||
20 | + public static Map<?, ?> loadYaml(String fileName) throws FileNotFoundException | ||
21 | + { | ||
22 | + InputStream in = YamlUtil.class.getClassLoader().getResourceAsStream(fileName); | ||
23 | + return StringUtils.isNotEmpty(fileName) ? (LinkedHashMap<?, ?>) new Yaml().load(in) : null; | ||
24 | + } | ||
25 | + | ||
26 | + public static void dumpYaml(String fileName, Map<?, ?> map) throws IOException | ||
27 | + { | ||
28 | + if (StringUtils.isNotEmpty(fileName)) | ||
29 | + { | ||
30 | + FileWriter fileWriter = new FileWriter(YamlUtil.class.getResource(fileName).getFile()); | ||
31 | + DumperOptions options = new DumperOptions(); | ||
32 | + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); | ||
33 | + Yaml yaml = new Yaml(options); | ||
34 | + yaml.dump(map, fileWriter); | ||
35 | + } | ||
36 | + } | ||
37 | + | ||
38 | + public static Object getProperty(Map<?, ?> map, Object qualifiedKey) | ||
39 | + { | ||
40 | + if (map != null && !map.isEmpty() && qualifiedKey != null) | ||
41 | + { | ||
42 | + String input = String.valueOf(qualifiedKey); | ||
43 | + if (!"".equals(input)) | ||
44 | + { | ||
45 | + if (input.contains(".")) | ||
46 | + { | ||
47 | + int index = input.indexOf("."); | ||
48 | + String left = input.substring(0, index); | ||
49 | + String right = input.substring(index + 1, input.length()); | ||
50 | + return getProperty((Map<?, ?>) map.get(left), right); | ||
51 | + } | ||
52 | + else if (map.containsKey(input)) | ||
53 | + { | ||
54 | + return map.get(input); | ||
55 | + } | ||
56 | + else | ||
57 | + { | ||
58 | + return null; | ||
59 | + } | ||
60 | + } | ||
61 | + } | ||
62 | + return null; | ||
63 | + } | ||
64 | + | ||
65 | + @SuppressWarnings("unchecked") | ||
66 | + public static void setProperty(Map<?, ?> map, Object qualifiedKey, Object value) | ||
67 | + { | ||
68 | + if (map != null && !map.isEmpty() && qualifiedKey != null) | ||
69 | + { | ||
70 | + String input = String.valueOf(qualifiedKey); | ||
71 | + if (!input.equals("")) | ||
72 | + { | ||
73 | + if (input.contains(".")) | ||
74 | + { | ||
75 | + int index = input.indexOf("."); | ||
76 | + String left = input.substring(0, index); | ||
77 | + String right = input.substring(index + 1, input.length()); | ||
78 | + setProperty((Map<?, ?>) map.get(left), right, value); | ||
79 | + } | ||
80 | + else | ||
81 | + { | ||
82 | + ((Map<Object, Object>) map).put(qualifiedKey, value); | ||
83 | + } | ||
84 | + } | ||
85 | + } | ||
86 | + } | ||
87 | +} | ||
0 | \ No newline at end of file | 88 | \ No newline at end of file |
src/main/java/com/huaheng/common/utils/file/FileUtils.java
1 | package com.huaheng.common.utils.file; | 1 | package com.huaheng.common.utils.file; |
2 | 2 | ||
3 | -import java.io.File; | ||
4 | -import java.io.FileInputStream; | ||
5 | -import java.io.FileNotFoundException; | ||
6 | -import java.io.IOException; | ||
7 | -import java.io.OutputStream; | 3 | +import javax.servlet.http.HttpServletRequest; |
4 | +import java.io.*; | ||
5 | +import java.net.URLEncoder; | ||
8 | 6 | ||
9 | /** | 7 | /** |
10 | * 文件处理工具类 | 8 | * 文件处理工具类 |
@@ -13,11 +11,13 @@ import java.io.OutputStream; | @@ -13,11 +11,13 @@ import java.io.OutputStream; | ||
13 | */ | 11 | */ |
14 | public class FileUtils | 12 | public class FileUtils |
15 | { | 13 | { |
14 | + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; | ||
16 | 15 | ||
17 | /** | 16 | /** |
18 | * 输出指定文件的byte数组 | 17 | * 输出指定文件的byte数组 |
19 | - * | ||
20 | - * @param filename 文件 | 18 | + * |
19 | + * @param filePath 文件路径 | ||
20 | + * @param os 输出流 | ||
21 | * @return | 21 | * @return |
22 | */ | 22 | */ |
23 | public static void writeBytes(String filePath, OutputStream os) throws IOException | 23 | public static void writeBytes(String filePath, OutputStream os) throws IOException |
@@ -88,4 +88,51 @@ public class FileUtils | @@ -88,4 +88,51 @@ public class FileUtils | ||
88 | return flag; | 88 | return flag; |
89 | } | 89 | } |
90 | 90 | ||
91 | + /** | ||
92 | + * 文件名称验证 | ||
93 | + * | ||
94 | + * @param filename 文件名称 | ||
95 | + * @return true 正常 false 非法 | ||
96 | + */ | ||
97 | + public static boolean isValidFilename(String filename) | ||
98 | + { | ||
99 | + return filename.matches(FILENAME_PATTERN); | ||
100 | + } | ||
101 | + | ||
102 | + /** | ||
103 | + * 下载文件名重新编码 | ||
104 | + * | ||
105 | + * @param request 请求对象 | ||
106 | + * @param fileName 文件名 | ||
107 | + * @return 编码后的文件名 | ||
108 | + */ | ||
109 | + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) | ||
110 | + throws UnsupportedEncodingException | ||
111 | + { | ||
112 | + final String agent = request.getHeader("USER-AGENT"); | ||
113 | + String filename = fileName; | ||
114 | + if (agent.contains("MSIE")) | ||
115 | + { | ||
116 | + // IE浏览器 | ||
117 | + filename = URLEncoder.encode(filename, "utf-8"); | ||
118 | + filename = filename.replace("+", " "); | ||
119 | + } | ||
120 | + else if (agent.contains("Firefox")) | ||
121 | + { | ||
122 | + // 火狐浏览器 | ||
123 | + filename = new String(fileName.getBytes(), "ISO8859-1"); | ||
124 | + } | ||
125 | + else if (agent.contains("Chrome")) | ||
126 | + { | ||
127 | + // google浏览器 | ||
128 | + filename = URLEncoder.encode(filename, "utf-8"); | ||
129 | + } | ||
130 | + else | ||
131 | + { | ||
132 | + // 其它浏览器 | ||
133 | + filename = URLEncoder.encode(filename, "utf-8"); | ||
134 | + } | ||
135 | + return filename; | ||
136 | + } | ||
137 | + | ||
91 | } | 138 | } |
src/main/java/com/huaheng/common/utils/poi/ExcelUtil.java
1 | package com.huaheng.common.utils.poi; | 1 | package com.huaheng.common.utils.poi; |
2 | 2 | ||
3 | -import java.io.FileNotFoundException; | 3 | +import java.io.File; |
4 | import java.io.FileOutputStream; | 4 | import java.io.FileOutputStream; |
5 | +import java.io.IOException; | ||
5 | import java.io.InputStream; | 6 | import java.io.InputStream; |
6 | import java.io.OutputStream; | 7 | import java.io.OutputStream; |
7 | import java.lang.reflect.Field; | 8 | import java.lang.reflect.Field; |
9 | +import java.lang.reflect.Method; | ||
8 | import java.math.BigDecimal; | 10 | import java.math.BigDecimal; |
9 | -import java.net.URLEncoder; | ||
10 | -import java.text.SimpleDateFormat; | ||
11 | -import java.util.*; | ||
12 | - | ||
13 | -import org.apache.poi.hssf.usermodel.DVConstraint; | ||
14 | -import org.apache.poi.hssf.usermodel.HSSFCell; | ||
15 | -import org.apache.poi.hssf.usermodel.HSSFCellStyle; | ||
16 | -import org.apache.poi.hssf.usermodel.HSSFDataValidation; | ||
17 | -import org.apache.poi.hssf.usermodel.HSSFFont; | ||
18 | -import org.apache.poi.hssf.usermodel.HSSFRow; | ||
19 | -import org.apache.poi.hssf.usermodel.HSSFSheet; | ||
20 | -import org.apache.poi.hssf.usermodel.HSSFWorkbook; | ||
21 | -import org.apache.poi.hssf.util.HSSFColor; | 11 | +import java.text.DecimalFormat; |
12 | +import java.util.ArrayList; | ||
13 | +import java.util.Arrays; | ||
14 | +import java.util.Date; | ||
15 | +import java.util.HashMap; | ||
16 | +import java.util.List; | ||
17 | +import java.util.Map; | ||
18 | +import java.util.UUID; | ||
19 | + | ||
20 | +import com.huaheng.common.annotation.Excels; | ||
21 | +import com.huaheng.common.config.Global; | ||
22 | +import com.huaheng.common.exception.BusinessException; | ||
23 | +import com.huaheng.common.support.Convert; | ||
24 | +import com.huaheng.common.utils.DateUtils; | ||
25 | +import com.huaheng.common.utils.StringUtils; | ||
26 | +import com.huaheng.common.utils.reflect.ReflectUtils; | ||
27 | +import com.huaheng.framework.aspectj.lang.annotation.Excel; | ||
28 | +import com.huaheng.framework.aspectj.lang.annotation.Excel.Type; | ||
29 | +import com.huaheng.framework.web.domain.AjaxResult; | ||
30 | +import org.apache.poi.hssf.usermodel.HSSFDateUtil; | ||
31 | +import org.apache.poi.ss.usermodel.BorderStyle; | ||
22 | import org.apache.poi.ss.usermodel.Cell; | 32 | import org.apache.poi.ss.usermodel.Cell; |
23 | import org.apache.poi.ss.usermodel.CellStyle; | 33 | import org.apache.poi.ss.usermodel.CellStyle; |
34 | +import org.apache.poi.ss.usermodel.CellType; | ||
35 | +import org.apache.poi.ss.usermodel.DataValidation; | ||
36 | +import org.apache.poi.ss.usermodel.DataValidationConstraint; | ||
37 | +import org.apache.poi.ss.usermodel.DataValidationHelper; | ||
38 | +import org.apache.poi.ss.usermodel.DateUtil; | ||
39 | +import org.apache.poi.ss.usermodel.FillPatternType; | ||
40 | +import org.apache.poi.ss.usermodel.Font; | ||
41 | +import org.apache.poi.ss.usermodel.HorizontalAlignment; | ||
42 | +import org.apache.poi.ss.usermodel.IndexedColors; | ||
24 | import org.apache.poi.ss.usermodel.Row; | 43 | import org.apache.poi.ss.usermodel.Row; |
25 | import org.apache.poi.ss.usermodel.Sheet; | 44 | import org.apache.poi.ss.usermodel.Sheet; |
45 | +import org.apache.poi.ss.usermodel.VerticalAlignment; | ||
26 | import org.apache.poi.ss.usermodel.Workbook; | 46 | import org.apache.poi.ss.usermodel.Workbook; |
27 | import org.apache.poi.ss.usermodel.WorkbookFactory; | 47 | import org.apache.poi.ss.usermodel.WorkbookFactory; |
28 | import org.apache.poi.ss.util.CellRangeAddressList; | 48 | import org.apache.poi.ss.util.CellRangeAddressList; |
49 | +import org.apache.poi.xssf.streaming.SXSSFWorkbook; | ||
50 | +import org.apache.poi.xssf.usermodel.XSSFDataValidation; | ||
29 | import org.slf4j.Logger; | 51 | import org.slf4j.Logger; |
30 | import org.slf4j.LoggerFactory; | 52 | import org.slf4j.LoggerFactory; |
31 | -import org.springframework.util.ResourceUtils; | ||
32 | -import com.huaheng.common.utils.StringUtils; | ||
33 | -import com.huaheng.framework.aspectj.lang.annotation.Excel; | ||
34 | -import com.huaheng.framework.shiro.web.session.OnlineWebSessionManager; | ||
35 | -import com.huaheng.framework.web.domain.AjaxResult; | ||
36 | - | ||
37 | -import javax.servlet.http.HttpServletResponse; | ||
38 | 53 | ||
39 | /** | 54 | /** |
40 | * Excel相关处理 | 55 | * Excel相关处理 |
41 | - * | ||
42 | - * @author huaheng | 56 | + * |
57 | + * @author ruoyi | ||
43 | */ | 58 | */ |
44 | public class ExcelUtil<T> | 59 | public class ExcelUtil<T> |
45 | { | 60 | { |
61 | + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); | ||
62 | + | ||
63 | + /** | ||
64 | + * Excel sheet最大行数,默认65536 | ||
65 | + */ | ||
66 | + public static final int sheetSize = 65536; | ||
67 | + | ||
68 | + /** | ||
69 | + * 工作表名称 | ||
70 | + */ | ||
71 | + private String sheetName; | ||
46 | 72 | ||
47 | - private static final Logger log = LoggerFactory.getLogger(OnlineWebSessionManager.class); | 73 | + /** |
74 | + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) | ||
75 | + */ | ||
76 | + private Type type; | ||
48 | 77 | ||
78 | + /** | ||
79 | + * 工作薄对象 | ||
80 | + */ | ||
81 | + private Workbook wb; | ||
82 | + | ||
83 | + /** | ||
84 | + * 工作表对象 | ||
85 | + */ | ||
86 | + private Sheet sheet; | ||
87 | + | ||
88 | + /** | ||
89 | + * 样式列表 | ||
90 | + */ | ||
91 | + private Map<String, CellStyle> styles; | ||
92 | + | ||
93 | + /** | ||
94 | + * 导入导出数据列表 | ||
95 | + */ | ||
96 | + private List<T> list; | ||
97 | + | ||
98 | + /** | ||
99 | + * 注解列表 | ||
100 | + */ | ||
101 | + private List<Object[]> fields; | ||
102 | + | ||
103 | + /** | ||
104 | + * 实体对象 | ||
105 | + */ | ||
49 | public Class<T> clazz; | 106 | public Class<T> clazz; |
50 | 107 | ||
51 | public ExcelUtil(Class<T> clazz) | 108 | public ExcelUtil(Class<T> clazz) |
@@ -53,29 +110,80 @@ public class ExcelUtil<T> | @@ -53,29 +110,80 @@ public class ExcelUtil<T> | ||
53 | this.clazz = clazz; | 110 | this.clazz = clazz; |
54 | } | 111 | } |
55 | 112 | ||
56 | - public ExcelUtil() | 113 | + public void init(List<T> list, String sheetName, Type type) |
57 | { | 114 | { |
115 | + if (list == null) | ||
116 | + { | ||
117 | + list = new ArrayList<T>(); | ||
118 | + } | ||
119 | + this.list = list; | ||
120 | + this.sheetName = sheetName; | ||
121 | + this.type = type; | ||
122 | + createExcelField(); | ||
123 | + createWorkbook(); | ||
58 | } | 124 | } |
59 | - public List<T> importExcel(String sheetName, InputStream input) throws Exception | 125 | + |
126 | + /** | ||
127 | + * 对excel表单默认第一个索引名转换成list | ||
128 | + * | ||
129 | + * @param is 输入流 | ||
130 | + * @return 转换后集合 | ||
131 | + */ | ||
132 | + public List<T> importExcel(InputStream is) throws Exception | ||
60 | { | 133 | { |
61 | - List<T> list = new ArrayList<T>(); | 134 | + return importExcel(StringUtils.EMPTY, is); |
135 | + } | ||
62 | 136 | ||
63 | - Workbook workbook = WorkbookFactory.create(input); | ||
64 | - Sheet sheet = workbook.getSheet(sheetName); | 137 | + /** |
138 | + * 对excel表单指定表格索引名转换成list | ||
139 | + * | ||
140 | + * @param sheetName 表格索引名 | ||
141 | + * @param is 输入流 | ||
142 | + * @return 转换后集合 | ||
143 | + */ | ||
144 | + public List<T> importExcel(String sheetName, InputStream is) throws Exception | ||
145 | + { | ||
146 | + this.type = Type.IMPORT; | ||
147 | + this.wb = WorkbookFactory.create(is); | ||
148 | + List<T> list = new ArrayList<T>(); | ||
149 | + Sheet sheet = null; | ||
65 | if (StringUtils.isNotEmpty(sheetName)) | 150 | if (StringUtils.isNotEmpty(sheetName)) |
66 | { | 151 | { |
67 | // 如果指定sheet名,则取指定sheet中的内容. | 152 | // 如果指定sheet名,则取指定sheet中的内容. |
68 | - sheet = workbook.getSheet(sheetName); | 153 | + sheet = wb.getSheet(sheetName); |
69 | } | 154 | } |
70 | - if (sheet == null) | 155 | + else |
71 | { | 156 | { |
72 | // 如果传入的sheet名不存在则默认指向第1个sheet. | 157 | // 如果传入的sheet名不存在则默认指向第1个sheet. |
73 | - sheet = workbook.getSheetAt(0); | 158 | + sheet = wb.getSheetAt(0); |
74 | } | 159 | } |
160 | + | ||
161 | + if (sheet == null) | ||
162 | + { | ||
163 | + throw new IOException("文件sheet不存在"); | ||
164 | + } | ||
165 | + | ||
75 | int rows = sheet.getPhysicalNumberOfRows(); | 166 | int rows = sheet.getPhysicalNumberOfRows(); |
76 | 167 | ||
77 | if (rows > 0) | 168 | if (rows > 0) |
78 | { | 169 | { |
170 | + // 定义一个map用于存放excel列的序号和field. | ||
171 | + Map<String, Integer> cellMap = new HashMap<String, Integer>(); | ||
172 | + // 获取表头 | ||
173 | + Row heard = sheet.getRow(0); | ||
174 | + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) | ||
175 | + { | ||
176 | + Cell cell = heard.getCell(i); | ||
177 | + if (StringUtils.isNotNull(cell != null)) | ||
178 | + { | ||
179 | + String value = this.getCellValue(heard, i).toString(); | ||
180 | + cellMap.put(value, i); | ||
181 | + } | ||
182 | + else | ||
183 | + { | ||
184 | + cellMap.put(null, i); | ||
185 | + } | ||
186 | + } | ||
79 | // 有数据时才处理 得到类的所有field. | 187 | // 有数据时才处理 得到类的所有field. |
80 | Field[] allFields = clazz.getDeclaredFields(); | 188 | Field[] allFields = clazz.getDeclaredFields(); |
81 | // 定义一个map用于存放列的序号和field. | 189 | // 定义一个map用于存放列的序号和field. |
@@ -83,461 +191,391 @@ public class ExcelUtil<T> | @@ -83,461 +191,391 @@ public class ExcelUtil<T> | ||
83 | for (int col = 0; col < allFields.length; col++) | 191 | for (int col = 0; col < allFields.length; col++) |
84 | { | 192 | { |
85 | Field field = allFields[col]; | 193 | Field field = allFields[col]; |
86 | - // 将有注解的field存放到map中. | ||
87 | - if (field.isAnnotationPresent(Excel.class)) | 194 | + Excel attr = field.getAnnotation(Excel.class); |
195 | + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) | ||
88 | { | 196 | { |
89 | // 设置类的私有字段属性可访问. | 197 | // 设置类的私有字段属性可访问. |
90 | field.setAccessible(true); | 198 | field.setAccessible(true); |
91 | - fieldsMap.put(col, field); | 199 | + Integer column = cellMap.get(attr.name()); |
200 | + fieldsMap.put(column, field); | ||
92 | } | 201 | } |
93 | } | 202 | } |
94 | for (int i = 1; i < rows; i++) | 203 | for (int i = 1; i < rows; i++) |
95 | { | 204 | { |
96 | // 从第2行开始取数据,默认第一行是表头. | 205 | // 从第2行开始取数据,默认第一行是表头. |
97 | Row row = sheet.getRow(i); | 206 | Row row = sheet.getRow(i); |
98 | - int cellNum = sheet.getRow(0).getPhysicalNumberOfCells(); | ||
99 | T entity = null; | 207 | T entity = null; |
100 | - for (int j = 0; j < cellNum; j++) | 208 | + for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet()) |
101 | { | 209 | { |
102 | - Cell cell = row.getCell(j); | ||
103 | - if (cell == null) | ||
104 | - { | ||
105 | - continue; | ||
106 | - } | ||
107 | - else | ||
108 | - { | ||
109 | - // 先设置Cell的类型,然后就可以把纯数字作为String类型读进来了 | ||
110 | - row.getCell(j).setCellType(Cell.CELL_TYPE_STRING); | ||
111 | - cell = row.getCell(j); | ||
112 | - } | ||
113 | - | ||
114 | - String c = cell.getStringCellValue(); | ||
115 | - if (StringUtils.isEmpty(c)) | ||
116 | - { | ||
117 | - continue; | ||
118 | - } | 210 | + Object val = this.getCellValue(row, entry.getKey()); |
119 | 211 | ||
120 | // 如果不存在实例则新建. | 212 | // 如果不存在实例则新建. |
121 | entity = (entity == null ? clazz.newInstance() : entity); | 213 | entity = (entity == null ? clazz.newInstance() : entity); |
122 | // 从map中得到对应列的field. | 214 | // 从map中得到对应列的field. |
123 | - Field field = fieldsMap.get(j); | 215 | + Field field = fieldsMap.get(entry.getKey()); |
124 | // 取得类型,并根据对象类型设置值. | 216 | // 取得类型,并根据对象类型设置值. |
125 | Class<?> fieldType = field.getType(); | 217 | Class<?> fieldType = field.getType(); |
126 | if (String.class == fieldType) | 218 | if (String.class == fieldType) |
127 | { | 219 | { |
128 | - field.set(entity, String.valueOf(c)); | 220 | + String s = Convert.toStr(val); |
221 | + if (StringUtils.endsWith(s, ".0")) | ||
222 | + { | ||
223 | + val = StringUtils.substringBefore(s, ".0"); | ||
224 | + } | ||
225 | + else | ||
226 | + { | ||
227 | + val = Convert.toStr(val); | ||
228 | + } | ||
129 | } | 229 | } |
130 | else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) | 230 | else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) |
131 | { | 231 | { |
132 | - field.set(entity, Integer.parseInt(c)); | 232 | + val = Convert.toInt(val); |
133 | } | 233 | } |
134 | - else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) | 234 | + else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) |
135 | { | 235 | { |
136 | - field.set(entity, Integer.valueOf(c)); | 236 | + val = Convert.toLong(val); |
137 | } | 237 | } |
138 | - else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) | 238 | + else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) |
139 | { | 239 | { |
140 | - field.set(entity, Float.valueOf(c)); | 240 | + val = Convert.toDouble(val); |
141 | } | 241 | } |
142 | - else if ((Short.TYPE == fieldType) || (Short.class == fieldType)) | 242 | + else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) |
143 | { | 243 | { |
144 | - field.set(entity, Short.valueOf(c)); | 244 | + val = Convert.toFloat(val); |
145 | } | 245 | } |
146 | - else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) | 246 | + else if (BigDecimal.class == fieldType) |
147 | { | 247 | { |
148 | - field.set(entity, Double.valueOf(c)); | 248 | + val = Convert.toBigDecimal(val); |
149 | } | 249 | } |
150 | - else if (Character.TYPE == fieldType) | 250 | + else if (Date.class == fieldType) |
151 | { | 251 | { |
152 | - if ((c != null) && (c.length() > 0)) | 252 | + if (val instanceof String) |
253 | + { | ||
254 | + val = DateUtils.parseDate(val); | ||
255 | + } | ||
256 | + else if (val instanceof Double) | ||
153 | { | 257 | { |
154 | - field.set(entity, Character.valueOf(c.charAt(0))); | 258 | + val = DateUtil.getJavaDate((Double) val); |
155 | } | 259 | } |
156 | } | 260 | } |
157 | - else if (java.util.Date.class == fieldType) | 261 | + if (StringUtils.isNotNull(fieldType)) |
158 | { | 262 | { |
159 | - if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) | 263 | + Excel attr = field.getAnnotation(Excel.class); |
264 | + String propertyName = field.getName(); | ||
265 | + if (StringUtils.isNotEmpty(attr.targetAttr())) | ||
160 | { | 266 | { |
161 | - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | ||
162 | - cell.setCellValue(sdf.format(cell.getNumericCellValue())); | ||
163 | - c = sdf.format(cell.getNumericCellValue()); | 267 | + propertyName = field.getName() + "." + attr.targetAttr(); |
164 | } | 268 | } |
165 | - else | 269 | + else if (StringUtils.isNotEmpty(attr.readConverterExp())) |
166 | { | 270 | { |
167 | - c = cell.getStringCellValue(); | 271 | + val = reverseByExp(String.valueOf(val), attr.readConverterExp()); |
168 | } | 272 | } |
273 | + ReflectUtils.invokeSetter(entity, propertyName, val); | ||
169 | } | 274 | } |
170 | - else if (java.math.BigDecimal.class == fieldType) | ||
171 | - { | ||
172 | - c = cell.getStringCellValue(); | ||
173 | - } | ||
174 | - } | ||
175 | - if (entity != null) | ||
176 | - { | ||
177 | - list.add(entity); | ||
178 | } | 275 | } |
276 | + list.add(entity); | ||
179 | } | 277 | } |
180 | } | 278 | } |
181 | - | ||
182 | return list; | 279 | return list; |
183 | } | 280 | } |
184 | 281 | ||
185 | /** | 282 | /** |
186 | * 对list数据源将其里面的数据导入到excel表单 | 283 | * 对list数据源将其里面的数据导入到excel表单 |
187 | - * | 284 | + * |
285 | + * @param list 导出数据集合 | ||
188 | * @param sheetName 工作表的名称 | 286 | * @param sheetName 工作表的名称 |
287 | + * @return 结果 | ||
189 | */ | 288 | */ |
190 | - public AjaxResult exportExcel2(List<LinkedHashMap<String,Object>> list, String sheetName,HttpServletResponse response) | 289 | + public AjaxResult exportExcel(List<T> list, String sheetName) |
191 | { | 290 | { |
192 | - if(list==null||list.size()==0){ | ||
193 | - return AjaxResult.error("无数据"); | ||
194 | - } | 291 | + this.init(list, sheetName, Type.EXPORT); |
292 | + return exportExcel(); | ||
293 | + } | ||
195 | 294 | ||
196 | - //表头 | ||
197 | - List<String> headers = new ArrayList<>(); | ||
198 | - for (Map.Entry<String, Object> entry : list.get(0).entrySet()) { | ||
199 | - headers.add(entry.getKey()); | ||
200 | - } | 295 | + /** |
296 | + * 对list数据源将其里面的数据导入到excel表单 | ||
297 | + * | ||
298 | + * @param sheetName 工作表的名称 | ||
299 | + * @return 结果 | ||
300 | + */ | ||
301 | + public AjaxResult importTemplateExcel(String sheetName) | ||
302 | + { | ||
303 | + this.init(null, sheetName, Type.IMPORT); | ||
304 | + return exportExcel(); | ||
305 | + } | ||
201 | 306 | ||
202 | - // 产生工作薄对象 | ||
203 | - HSSFWorkbook workbook = new HSSFWorkbook(); | ||
204 | - // excel2003中每个sheet中最多有65536行 | ||
205 | - int sheetSize = 65536; | ||
206 | - // 取出一共有多少个sheet. | ||
207 | - double sheetNo = Math.ceil(list.size() / sheetSize); | ||
208 | - for (int index = 0; index <= sheetNo; index++) | 307 | + /** |
308 | + * 对list数据源将其里面的数据导入到excel表单 | ||
309 | + * | ||
310 | + * @return 结果 | ||
311 | + */ | ||
312 | + public AjaxResult exportExcel() | ||
313 | + { | ||
314 | + OutputStream out = null; | ||
315 | + try | ||
209 | { | 316 | { |
210 | - // 产生工作表对象 | ||
211 | - HSSFSheet sheet = workbook.createSheet(); | ||
212 | - if (sheetNo == 0) | 317 | + // 取出一共有多少个sheet. |
318 | + double sheetNo = Math.ceil(list.size() / sheetSize); | ||
319 | + for (int index = 0; index <= sheetNo; index++) | ||
213 | { | 320 | { |
214 | - workbook.setSheetName(index, sheetName); | 321 | + createSheet(sheetNo, index); |
322 | + | ||
323 | + // 产生一行 | ||
324 | + Row row = sheet.createRow(0); | ||
325 | + int column = 0; | ||
326 | + // 写入各个字段的列头名称 | ||
327 | + for (Object[] os : fields) | ||
328 | + { | ||
329 | + Excel excel = (Excel) os[1]; | ||
330 | + this.createCell(excel, row, column++); | ||
331 | + } | ||
332 | + if (Type.EXPORT.equals(type)) | ||
333 | + { | ||
334 | + fillExcelData(index, row); | ||
335 | + } | ||
215 | } | 336 | } |
216 | - else | 337 | + String filename = encodingFilename(sheetName); |
338 | + out = new FileOutputStream(getAbsoluteFile(filename)); | ||
339 | + wb.write(out); | ||
340 | + return AjaxResult.success(filename); | ||
341 | + } | ||
342 | + catch (Exception e) | ||
343 | + { | ||
344 | + log.error("导出Excel异常{}", e.getMessage()); | ||
345 | + throw new BusinessException("导出Excel失败,请联系网站管理员!"); | ||
346 | + } | ||
347 | + finally | ||
348 | + { | ||
349 | + if (wb != null) | ||
217 | { | 350 | { |
218 | - // 设置工作表的名称. | ||
219 | - workbook.setSheetName(index, sheetName + index); | 351 | + try |
352 | + { | ||
353 | + wb.close(); | ||
354 | + } | ||
355 | + catch (IOException e1) | ||
356 | + { | ||
357 | + e1.printStackTrace(); | ||
358 | + } | ||
220 | } | 359 | } |
221 | - HSSFRow row; | ||
222 | - HSSFCell cell; // 产生单元格 | ||
223 | - | ||
224 | - // 产生一行 | ||
225 | - row = sheet.createRow(0); | ||
226 | - // 写入各个字段的列头名称 | ||
227 | - for (int i = 0; i < headers.size(); i++) | 360 | + if (out != null) |
228 | { | 361 | { |
229 | - // 创建列 | ||
230 | - String attr = headers.get(i); | ||
231 | - cell = row.createCell(i); | ||
232 | - // 设置列中写入内容为String类型 | ||
233 | - cell.setCellType(HSSFCell.CELL_TYPE_STRING); | ||
234 | - HSSFCellStyle cellStyle = workbook.createCellStyle(); | ||
235 | - cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); | ||
236 | - cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); | ||
237 | - if (attr.contains("注:")) | 362 | + try |
238 | { | 363 | { |
239 | - HSSFFont font = workbook.createFont(); | ||
240 | - font.setColor(HSSFFont.COLOR_RED); | ||
241 | - cellStyle.setFont(font); | ||
242 | - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); | ||
243 | - sheet.setColumnWidth(i, 6000); | 364 | + out.close(); |
244 | } | 365 | } |
245 | - else | 366 | + catch (IOException e1) |
246 | { | 367 | { |
247 | - HSSFFont font = workbook.createFont(); | ||
248 | - // 粗体显示 | ||
249 | - font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); | ||
250 | - // 选择需要用到的字体格式 | ||
251 | - cellStyle.setFont(font); | ||
252 | - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); | ||
253 | - // 设置列宽 | ||
254 | - sheet.setColumnWidth(i, 3766); | 368 | + e1.printStackTrace(); |
255 | } | 369 | } |
256 | - cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); | ||
257 | - cellStyle.setWrapText(true); | ||
258 | - cell.setCellStyle(cellStyle); | ||
259 | - | ||
260 | - // 写入列名 | ||
261 | - cell.setCellValue(attr); | ||
262 | - | ||
263 | - // 如果设置了提示信息则鼠标放上去提示. | ||
264 | -// if (StringUtils.isNotEmpty(attr.prompt())) | ||
265 | -// { | ||
266 | -// // 这里默认设了2-101列提示. | ||
267 | -// setHSSFPrompt(sheet, "", attr.prompt(), 1, 100, i, i); | ||
268 | -// } | ||
269 | -// // 如果设置了combo属性则本列只能选择不能输入 | ||
270 | -// if (attr.combo().length > 0) | ||
271 | -// { | ||
272 | -// // 这里默认设了2-101列只能选择不能输入. | ||
273 | -// setHSSFValidation(sheet, attr.combo(), 1, 100, i, i); | ||
274 | -// } | ||
275 | } | 370 | } |
371 | + } | ||
372 | + } | ||
276 | 373 | ||
277 | - int startNo = index * sheetSize; | ||
278 | - int endNo = Math.min(startNo + sheetSize, list.size()); | ||
279 | - // 写入各条记录,每条记录对应excel表中的一行 | ||
280 | - HSSFCellStyle cs = workbook.createCellStyle(); | ||
281 | - cs.setAlignment(HSSFCellStyle.ALIGN_CENTER); | ||
282 | - cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); | ||
283 | - for (int i = startNo; i < endNo; i++) | 374 | + /** |
375 | + * 填充excel数据 | ||
376 | + * | ||
377 | + * @param index 序号 | ||
378 | + * @param row 单元格行 | ||
379 | + * @param cell 类型单元格 | ||
380 | + */ | ||
381 | + public void fillExcelData(int index, Row row) | ||
382 | + { | ||
383 | + int startNo = index * sheetSize; | ||
384 | + int endNo = Math.min(startNo + sheetSize, list.size()); | ||
385 | + for (int i = startNo; i < endNo; i++) | ||
386 | + { | ||
387 | + row = sheet.createRow(i + 1 - startNo); | ||
388 | + // 得到导出对象. | ||
389 | + T vo = (T) list.get(i); | ||
390 | + int column = 0; | ||
391 | + for (Object[] os : fields) | ||
284 | { | 392 | { |
285 | - row = sheet.createRow(i + 1 - startNo); | ||
286 | - // 得到导出对象. | ||
287 | - LinkedHashMap<String, Object> map = list.get(i); | ||
288 | - int tempCount = 0; | ||
289 | - for (Map.Entry<String, Object> entry : map.entrySet()) { | ||
290 | - try{ | ||
291 | - cell = row.createCell(tempCount); | ||
292 | - cell.setCellStyle(cs); | ||
293 | - try{ | ||
294 | - if (String.valueOf(entry.getValue()).length() > 10) | ||
295 | - { | ||
296 | - throw new Exception("长度超过10位就不用转数字了"); | ||
297 | - } | ||
298 | - // 如果可以转成数字则导出为数字类型 | ||
299 | - BigDecimal bc = new BigDecimal(String.valueOf(entry.getValue())); | ||
300 | - cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); | ||
301 | - cell.setCellValue(bc.doubleValue()); | ||
302 | - | ||
303 | - }catch (Throwable tt){ | ||
304 | - cell.setCellType(HSSFCell.CELL_TYPE_STRING); | ||
305 | - if (entry.getValue() == null) | ||
306 | - { | ||
307 | - // 如果数据存在就填入,不存在填入空格. | ||
308 | - cell.setCellValue(""); | ||
309 | - } | ||
310 | - else | ||
311 | - { | ||
312 | - // 如果数据存在就填入,不存在填入空格. | ||
313 | - cell.setCellValue(entry.getValue() == null ? "" : String.valueOf(entry.getValue())); | ||
314 | - } | ||
315 | - } | ||
316 | - | ||
317 | - }catch (Throwable t){ | ||
318 | - log.error("导出Excel失败{}", t.getMessage()); | ||
319 | - } | ||
320 | - tempCount++; | ||
321 | - } | 393 | + Field field = (Field) os[0]; |
394 | + Excel excel = (Excel) os[1]; | ||
395 | + // 设置实体类私有属性可访问 | ||
396 | + field.setAccessible(true); | ||
397 | + this.addCell(excel, row, vo, field, column++); | ||
322 | } | 398 | } |
323 | } | 399 | } |
324 | - try | 400 | + } |
401 | + | ||
402 | + /** | ||
403 | + * 创建表格样式 | ||
404 | + * | ||
405 | + * @param wb 工作薄对象 | ||
406 | + * @return 样式列表 | ||
407 | + */ | ||
408 | + private Map<String, CellStyle> createStyles(Workbook wb) | ||
409 | + { | ||
410 | + // 写入各条记录,每条记录对应excel表中的一行 | ||
411 | + Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); | ||
412 | + CellStyle style = wb.createCellStyle(); | ||
413 | + style.setAlignment(HorizontalAlignment.CENTER); | ||
414 | + style.setVerticalAlignment(VerticalAlignment.CENTER); | ||
415 | + style.setBorderRight(BorderStyle.THIN); | ||
416 | + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); | ||
417 | + style.setBorderLeft(BorderStyle.THIN); | ||
418 | + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); | ||
419 | + style.setBorderTop(BorderStyle.THIN); | ||
420 | + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); | ||
421 | + style.setBorderBottom(BorderStyle.THIN); | ||
422 | + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); | ||
423 | + Font dataFont = wb.createFont(); | ||
424 | + dataFont.setFontName("Arial"); | ||
425 | + dataFont.setFontHeightInPoints((short) 10); | ||
426 | + style.setFont(dataFont); | ||
427 | + styles.put("data", style); | ||
428 | + | ||
429 | + style = wb.createCellStyle(); | ||
430 | + style.cloneStyleFrom(styles.get("data")); | ||
431 | + style.setAlignment(HorizontalAlignment.CENTER); | ||
432 | + style.setVerticalAlignment(VerticalAlignment.CENTER); | ||
433 | + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); | ||
434 | + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); | ||
435 | + Font headerFont = wb.createFont(); | ||
436 | + headerFont.setFontName("Arial"); | ||
437 | + headerFont.setFontHeightInPoints((short) 10); | ||
438 | + headerFont.setBold(true); | ||
439 | + headerFont.setColor(IndexedColors.WHITE.getIndex()); | ||
440 | + style.setFont(headerFont); | ||
441 | + styles.put("header", style); | ||
442 | + | ||
443 | + return styles; | ||
444 | + } | ||
445 | + | ||
446 | + /** | ||
447 | + * 创建单元格 | ||
448 | + */ | ||
449 | + public Cell createCell(Excel attr, Row row, int column) | ||
450 | + { | ||
451 | + // 创建列 | ||
452 | + Cell cell = row.createCell(column); | ||
453 | + // 写入列信息 | ||
454 | + cell.setCellValue(attr.name()); | ||
455 | + setDataValidation(attr, row, column); | ||
456 | + cell.setCellStyle(styles.get("header")); | ||
457 | + return cell; | ||
458 | + } | ||
459 | + | ||
460 | + /** | ||
461 | + * 设置单元格信息 | ||
462 | + * | ||
463 | + * @param value 单元格值 | ||
464 | + * @param attr 注解相关 | ||
465 | + * @param cell 单元格信息 | ||
466 | + */ | ||
467 | + public void setCellVo(Object value, Excel attr, Cell cell) | ||
468 | + { | ||
469 | + if (Excel.ColumnType.STRING == attr.cellType()) | ||
325 | { | 470 | { |
326 | - response.setContentType("application/vnd.ms-excel"); | ||
327 | - String fileName = encodingFilename(sheetName); | ||
328 | - response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8")); | ||
329 | - OutputStream out = response.getOutputStream(); | ||
330 | - workbook.write(out); | ||
331 | - out.close(); | ||
332 | - return AjaxResult.success(fileName); | 471 | + cell.setCellType(CellType.NUMERIC); |
472 | + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); | ||
333 | } | 473 | } |
334 | - catch (Exception e) | 474 | + else if (Excel.ColumnType.NUMERIC == attr.cellType()) |
335 | { | 475 | { |
336 | - log.error("关闭flush失败{}", e.getMessage()); | ||
337 | - return AjaxResult.error("导出Excel失败,请联系网站管理员!"); | 476 | + cell.setCellType(CellType.NUMERIC); |
477 | + cell.setCellValue(Integer.parseInt(value + "")); | ||
338 | } | 478 | } |
339 | } | 479 | } |
340 | 480 | ||
341 | /** | 481 | /** |
342 | - * 对list数据源将其里面的数据导入到excel表单 | ||
343 | - * | ||
344 | - * @param sheetName 工作表的名称 | 482 | + * 创建表格样式 |
345 | */ | 483 | */ |
346 | - public AjaxResult exportExcel(List<T> list, String sheetName) | 484 | + public void setDataValidation(Excel attr, Row row, int column) |
347 | { | 485 | { |
348 | - // 得到所有定义字段 | ||
349 | - Field[] allFields = clazz.getDeclaredFields(); | ||
350 | - List<Field> fields = new ArrayList<Field>(); | ||
351 | - // 得到所有field并存放到一个list中. | ||
352 | - for (Field field : allFields) | 486 | + if (attr.name().indexOf("注:") >= 0) |
353 | { | 487 | { |
354 | - if (field.isAnnotationPresent(Excel.class)) | ||
355 | - { | ||
356 | - fields.add(field); | ||
357 | - } | 488 | + sheet.setColumnWidth(column, 6000); |
358 | } | 489 | } |
359 | - | ||
360 | - // 产生工作薄对象 | ||
361 | - HSSFWorkbook workbook = new HSSFWorkbook(); | ||
362 | - // excel2003中每个sheet中最多有65536行 | ||
363 | - int sheetSize = 65536; | ||
364 | - // 取出一共有多少个sheet. | ||
365 | - double sheetNo = Math.ceil(list.size() / sheetSize); | ||
366 | - for (int index = 0; index <= sheetNo; index++) | 490 | + else |
367 | { | 491 | { |
368 | - // 产生工作表对象 | ||
369 | - HSSFSheet sheet = workbook.createSheet(); | ||
370 | - if (sheetNo == 0) | ||
371 | - { | ||
372 | - workbook.setSheetName(index, sheetName); | ||
373 | - } | ||
374 | - else | ||
375 | - { | ||
376 | - // 设置工作表的名称. | ||
377 | - workbook.setSheetName(index, sheetName + index); | ||
378 | - } | ||
379 | - HSSFRow row; | ||
380 | - HSSFCell cell; // 产生单元格 | 492 | + // 设置列宽 |
493 | + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); | ||
494 | + row.setHeight((short) (attr.height() * 20)); | ||
495 | + } | ||
496 | + // 如果设置了提示信息则鼠标放上去提示. | ||
497 | + if (StringUtils.isNotEmpty(attr.prompt())) | ||
498 | + { | ||
499 | + // 这里默认设了2-101列提示. | ||
500 | + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); | ||
501 | + } | ||
502 | + // 如果设置了combo属性则本列只能选择不能输入 | ||
503 | + if (attr.combo().length > 0) | ||
504 | + { | ||
505 | + // 这里默认设了2-101列只能选择不能输入. | ||
506 | + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); | ||
507 | + } | ||
508 | + } | ||
381 | 509 | ||
382 | - // 产生一行 | ||
383 | - row = sheet.createRow(0); | ||
384 | - // 写入各个字段的列头名称 | ||
385 | - for (int i = 0; i < fields.size(); i++) | 510 | + /** |
511 | + * 添加单元格 | ||
512 | + */ | ||
513 | + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) | ||
514 | + { | ||
515 | + Cell cell = null; | ||
516 | + try | ||
517 | + { | ||
518 | + // 设置行高 | ||
519 | + row.setHeight((short) (attr.height() * 20)); | ||
520 | + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. | ||
521 | + if (attr.isExport()) | ||
386 | { | 522 | { |
387 | - Field field = fields.get(i); | ||
388 | - Excel attr = field.getAnnotation(Excel.class); | ||
389 | - // 创建列 | ||
390 | - cell = row.createCell(i); | ||
391 | - // 设置列中写入内容为String类型 | ||
392 | - cell.setCellType(HSSFCell.CELL_TYPE_STRING); | ||
393 | - HSSFCellStyle cellStyle = workbook.createCellStyle(); | ||
394 | - cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); | ||
395 | - cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); | ||
396 | - if (attr.name().indexOf("注:") >= 0) | 523 | + // 创建cell |
524 | + cell = row.createCell(column); | ||
525 | + cell.setCellStyle(styles.get("data")); | ||
526 | + | ||
527 | + // 用于读取对象中的属性 | ||
528 | + Object value = getTargetValue(vo, field, attr); | ||
529 | + String dateFormat = attr.dateFormat(); | ||
530 | + String readConverterExp = attr.readConverterExp(); | ||
531 | + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) | ||
397 | { | 532 | { |
398 | - HSSFFont font = workbook.createFont(); | ||
399 | - font.setColor(HSSFFont.COLOR_RED); | ||
400 | - cellStyle.setFont(font); | ||
401 | - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); | ||
402 | - sheet.setColumnWidth(i, 6000); | 533 | + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); |
403 | } | 534 | } |
404 | - else | ||
405 | - { | ||
406 | - HSSFFont font = workbook.createFont(); | ||
407 | - // 粗体显示 | ||
408 | - font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); | ||
409 | - // 选择需要用到的字体格式 | ||
410 | - cellStyle.setFont(font); | ||
411 | - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); | ||
412 | - // 设置列宽 | ||
413 | - sheet.setColumnWidth(i, 3766); | ||
414 | - } | ||
415 | - cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); | ||
416 | - cellStyle.setWrapText(true); | ||
417 | - cell.setCellStyle(cellStyle); | ||
418 | - | ||
419 | - // 写入列名 | ||
420 | - cell.setCellValue(attr.name()); | ||
421 | - | ||
422 | - // 如果设置了提示信息则鼠标放上去提示. | ||
423 | - if (StringUtils.isNotEmpty(attr.prompt())) | 535 | + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) |
424 | { | 536 | { |
425 | - // 这里默认设了2-101列提示. | ||
426 | - setHSSFPrompt(sheet, "", attr.prompt(), 1, 100, i, i); | 537 | + cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp)); |
427 | } | 538 | } |
428 | - // 如果设置了combo属性则本列只能选择不能输入 | ||
429 | - if (attr.combo().length > 0) | 539 | + else |
430 | { | 540 | { |
431 | - // 这里默认设了2-101列只能选择不能输入. | ||
432 | - setHSSFValidation(sheet, attr.combo(), 1, 100, i, i); | ||
433 | - } | ||
434 | - } | ||
435 | - | ||
436 | - int startNo = index * sheetSize; | ||
437 | - int endNo = Math.min(startNo + sheetSize, list.size()); | ||
438 | - // 写入各条记录,每条记录对应excel表中的一行 | ||
439 | - HSSFCellStyle cs = workbook.createCellStyle(); | ||
440 | - cs.setAlignment(HSSFCellStyle.ALIGN_CENTER); | ||
441 | - cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); | ||
442 | - for (int i = startNo; i < endNo; i++) | ||
443 | - { | ||
444 | - row = sheet.createRow(i + 1 - startNo); | ||
445 | - // 得到导出对象. | ||
446 | - T vo = (T) list.get(i); | ||
447 | - for (int j = 0; j < fields.size(); j++) | ||
448 | - { | ||
449 | - // 获得field. | ||
450 | - Field field = fields.get(j); | ||
451 | - // 设置实体类私有属性可访问 | ||
452 | - field.setAccessible(true); | ||
453 | - Excel attr = field.getAnnotation(Excel.class); | ||
454 | - try | ||
455 | - { | ||
456 | - // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. | ||
457 | - if (attr.isExport()) | ||
458 | - { | ||
459 | - // 创建cell | ||
460 | - cell = row.createCell(j); | ||
461 | - cell.setCellStyle(cs); | ||
462 | - try | ||
463 | - { | ||
464 | - if (String.valueOf(field.get(vo)).length() > 10) | ||
465 | - { | ||
466 | - throw new Exception("长度超过10位就不用转数字了"); | ||
467 | - } | ||
468 | - // 如果可以转成数字则导出为数字类型 | ||
469 | - BigDecimal bc = new BigDecimal(String.valueOf(field.get(vo))); | ||
470 | - cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); | ||
471 | - cell.setCellValue(bc.doubleValue()); | ||
472 | - } | ||
473 | - catch (Exception e) | ||
474 | - { | ||
475 | - cell.setCellType(HSSFCell.CELL_TYPE_STRING); | ||
476 | - if (vo == null) | ||
477 | - { | ||
478 | - // 如果数据存在就填入,不存在填入空格. | ||
479 | - cell.setCellValue(""); | ||
480 | - } | ||
481 | - else | ||
482 | - { | ||
483 | - // 如果数据存在就填入,不存在填入空格. | ||
484 | - cell.setCellValue(field.get(vo) == null ? "" : String.valueOf(field.get(vo))); | ||
485 | - } | ||
486 | - | ||
487 | - } | ||
488 | - } | ||
489 | - } | ||
490 | - catch (Exception e) | ||
491 | - { | ||
492 | - log.error("导出Excel失败{}", e.getMessage()); | ||
493 | - } | 541 | + // 设置列类型 |
542 | + setCellVo(value, attr, cell); | ||
494 | } | 543 | } |
495 | } | 544 | } |
496 | } | 545 | } |
497 | - try | ||
498 | - { | ||
499 | - String filename = encodingFilename(sheetName); | ||
500 | - OutputStream out = new FileOutputStream(getfile() + filename); | ||
501 | - workbook.write(out); | ||
502 | - out.close(); | ||
503 | - return AjaxResult.success(filename); | ||
504 | - } | ||
505 | catch (Exception e) | 546 | catch (Exception e) |
506 | { | 547 | { |
507 | - log.error("关闭flush失败{}", e.getMessage()); | ||
508 | - return AjaxResult.error("导出Excel失败,请联系网站管理员!"); | 548 | + log.error("导出Excel失败{}", e); |
509 | } | 549 | } |
550 | + return cell; | ||
510 | } | 551 | } |
511 | 552 | ||
512 | /** | 553 | /** |
513 | - * 设置单元格上提示 | ||
514 | - * | ||
515 | - * @param sheet 要设置的sheet. | ||
516 | - * @param promptTitle 标题 | ||
517 | - * @param promptContent 内容 | 554 | + * 设置 POI XSSFSheet 单元格提示 |
555 | + * | ||
556 | + * @param sheet 表单 | ||
557 | + * @param promptTitle 提示标题 | ||
558 | + * @param promptContent 提示内容 | ||
518 | * @param firstRow 开始行 | 559 | * @param firstRow 开始行 |
519 | * @param endRow 结束行 | 560 | * @param endRow 结束行 |
520 | * @param firstCol 开始列 | 561 | * @param firstCol 开始列 |
521 | * @param endCol 结束列 | 562 | * @param endCol 结束列 |
522 | - * @return 设置好的sheet. | ||
523 | */ | 563 | */ |
524 | - public static HSSFSheet setHSSFPrompt(HSSFSheet sheet, String promptTitle, String promptContent, int firstRow, | ||
525 | - int endRow, int firstCol, int endCol) | 564 | + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, |
565 | + int firstCol, int endCol) | ||
526 | { | 566 | { |
527 | - // 构造constraint对象 | ||
528 | - DVConstraint constraint = DVConstraint.createCustomFormulaConstraint("DD1"); | ||
529 | - // 四个参数分别是:起始行、终止行、起始列、终止列 | 567 | + DataValidationHelper helper = sheet.getDataValidationHelper(); |
568 | + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); | ||
530 | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); | 569 | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); |
531 | - // 数据有效性对象 | ||
532 | - HSSFDataValidation dataValidationView = new HSSFDataValidation(regions, constraint); | ||
533 | - dataValidationView.createPromptBox(promptTitle, promptContent); | ||
534 | - sheet.addValidationData(dataValidationView); | ||
535 | - return sheet; | 570 | + DataValidation dataValidation = helper.createValidation(constraint, regions); |
571 | + dataValidation.createPromptBox(promptTitle, promptContent); | ||
572 | + dataValidation.setShowPromptBox(true); | ||
573 | + sheet.addValidationData(dataValidation); | ||
536 | } | 574 | } |
537 | 575 | ||
538 | /** | 576 | /** |
539 | * 设置某些列的值只能输入预制的数据,显示下拉框. | 577 | * 设置某些列的值只能输入预制的数据,显示下拉框. |
540 | - * | 578 | + * |
541 | * @param sheet 要设置的sheet. | 579 | * @param sheet 要设置的sheet. |
542 | * @param textlist 下拉框显示的内容 | 580 | * @param textlist 下拉框显示的内容 |
543 | * @param firstRow 开始行 | 581 | * @param firstRow 开始行 |
@@ -546,17 +584,85 @@ public class ExcelUtil<T> | @@ -546,17 +584,85 @@ public class ExcelUtil<T> | ||
546 | * @param endCol 结束列 | 584 | * @param endCol 结束列 |
547 | * @return 设置好的sheet. | 585 | * @return 设置好的sheet. |
548 | */ | 586 | */ |
549 | - public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow, | ||
550 | - int firstCol, int endCol) | 587 | + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) |
551 | { | 588 | { |
589 | + DataValidationHelper helper = sheet.getDataValidationHelper(); | ||
552 | // 加载下拉列表内容 | 590 | // 加载下拉列表内容 |
553 | - DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist); | 591 | + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); |
554 | // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 | 592 | // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 |
555 | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); | 593 | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); |
556 | // 数据有效性对象 | 594 | // 数据有效性对象 |
557 | - HSSFDataValidation dataValidationList = new HSSFDataValidation(regions, constraint); | ||
558 | - sheet.addValidationData(dataValidationList); | ||
559 | - return sheet; | 595 | + DataValidation dataValidation = helper.createValidation(constraint, regions); |
596 | + // 处理Excel兼容性问题 | ||
597 | + if (dataValidation instanceof XSSFDataValidation) | ||
598 | + { | ||
599 | + dataValidation.setSuppressDropDownArrow(true); | ||
600 | + dataValidation.setShowErrorBox(true); | ||
601 | + } | ||
602 | + else | ||
603 | + { | ||
604 | + dataValidation.setSuppressDropDownArrow(false); | ||
605 | + } | ||
606 | + | ||
607 | + sheet.addValidationData(dataValidation); | ||
608 | + } | ||
609 | + | ||
610 | + /** | ||
611 | + * 解析导出值 0=男,1=女,2=未知 | ||
612 | + * | ||
613 | + * @param propertyValue 参数值 | ||
614 | + * @param converterExp 翻译注解 | ||
615 | + * @return 解析后值 | ||
616 | + * @throws Exception | ||
617 | + */ | ||
618 | + public static String convertByExp(String propertyValue, String converterExp) throws Exception | ||
619 | + { | ||
620 | + try | ||
621 | + { | ||
622 | + String[] convertSource = converterExp.split(","); | ||
623 | + for (String item : convertSource) | ||
624 | + { | ||
625 | + String[] itemArray = item.split("="); | ||
626 | + if (itemArray[0].equals(propertyValue)) | ||
627 | + { | ||
628 | + return itemArray[1]; | ||
629 | + } | ||
630 | + } | ||
631 | + } | ||
632 | + catch (Exception e) | ||
633 | + { | ||
634 | + throw e; | ||
635 | + } | ||
636 | + return propertyValue; | ||
637 | + } | ||
638 | + | ||
639 | + /** | ||
640 | + * 反向解析值 男=0,女=1,未知=2 | ||
641 | + * | ||
642 | + * @param propertyValue 参数值 | ||
643 | + * @param converterExp 翻译注解 | ||
644 | + * @return 解析后值 | ||
645 | + * @throws Exception | ||
646 | + */ | ||
647 | + public static String reverseByExp(String propertyValue, String converterExp) throws Exception | ||
648 | + { | ||
649 | + try | ||
650 | + { | ||
651 | + String[] convertSource = converterExp.split(","); | ||
652 | + for (String item : convertSource) | ||
653 | + { | ||
654 | + String[] itemArray = item.split("="); | ||
655 | + if (itemArray[1].equals(propertyValue)) | ||
656 | + { | ||
657 | + return itemArray[0]; | ||
658 | + } | ||
659 | + } | ||
660 | + } | ||
661 | + catch (Exception e) | ||
662 | + { | ||
663 | + throw e; | ||
664 | + } | ||
665 | + return propertyValue; | ||
560 | } | 666 | } |
561 | 667 | ||
562 | /** | 668 | /** |
@@ -564,13 +670,205 @@ public class ExcelUtil<T> | @@ -564,13 +670,205 @@ public class ExcelUtil<T> | ||
564 | */ | 670 | */ |
565 | public String encodingFilename(String filename) | 671 | public String encodingFilename(String filename) |
566 | { | 672 | { |
567 | - filename = UUID.randomUUID().toString() + "_" + filename + ".xls"; | 673 | + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; |
568 | return filename; | 674 | return filename; |
569 | } | 675 | } |
570 | 676 | ||
571 | - public String getfile() throws FileNotFoundException | 677 | + /** |
678 | + * 获取下载路径 | ||
679 | + * | ||
680 | + * @param filename 文件名称 | ||
681 | + */ | ||
682 | + public String getAbsoluteFile(String filename) | ||
683 | + { | ||
684 | + String downloadPath = Global.getDownloadPath() + filename; | ||
685 | + File desc = new File(downloadPath); | ||
686 | + if (!desc.getParentFile().exists()) | ||
687 | + { | ||
688 | + desc.getParentFile().mkdirs(); | ||
689 | + } | ||
690 | + return downloadPath; | ||
691 | + } | ||
692 | + | ||
693 | + /** | ||
694 | + * 获取bean中的属性值 | ||
695 | + * | ||
696 | + * @param vo 实体对象 | ||
697 | + * @param field 字段 | ||
698 | + * @param excel 注解 | ||
699 | + * @return 最终的属性值 | ||
700 | + * @throws Exception | ||
701 | + */ | ||
702 | + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception | ||
703 | + { | ||
704 | + Object o = field.get(vo); | ||
705 | + if (StringUtils.isNotEmpty(excel.targetAttr())) | ||
706 | + { | ||
707 | + String target = excel.targetAttr(); | ||
708 | + if (target.indexOf(".") > -1) | ||
709 | + { | ||
710 | + String[] targets = target.split("[.]"); | ||
711 | + for (String name : targets) | ||
712 | + { | ||
713 | + o = getValue(o, name); | ||
714 | + } | ||
715 | + } | ||
716 | + else | ||
717 | + { | ||
718 | + o = getValue(o, target); | ||
719 | + } | ||
720 | + } | ||
721 | + return o; | ||
722 | + } | ||
723 | + | ||
724 | + /** | ||
725 | + * 以类的属性的get方法方法形式获取值 | ||
726 | + * | ||
727 | + * @param o | ||
728 | + * @param name | ||
729 | + * @return value | ||
730 | + * @throws Exception | ||
731 | + */ | ||
732 | + private Object getValue(Object o, String name) throws Exception | ||
572 | { | 733 | { |
573 | - return ResourceUtils.getURL("classpath:").getPath() + "static/file/"; | 734 | + if (StringUtils.isNotEmpty(name)) |
735 | + { | ||
736 | + Class<?> clazz = o.getClass(); | ||
737 | + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); | ||
738 | + Method method = clazz.getMethod(methodName); | ||
739 | + o = method.invoke(o); | ||
740 | + } | ||
741 | + return o; | ||
574 | } | 742 | } |
575 | 743 | ||
744 | + /** | ||
745 | + * 得到所有定义字段 | ||
746 | + */ | ||
747 | + private void createExcelField() | ||
748 | + { | ||
749 | + this.fields = new ArrayList<Object[]>(); | ||
750 | + List<Field> tempFields = new ArrayList<>(); | ||
751 | + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); | ||
752 | + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); | ||
753 | + for (Field field : tempFields) | ||
754 | + { | ||
755 | + // 单注解 | ||
756 | + if (field.isAnnotationPresent(Excel.class)) | ||
757 | + { | ||
758 | + putToField(field, field.getAnnotation(Excel.class)); | ||
759 | + } | ||
760 | + | ||
761 | + // 多注解 | ||
762 | + if (field.isAnnotationPresent(Excels.class)) | ||
763 | + { | ||
764 | + Excels attrs = field.getAnnotation(Excels.class); | ||
765 | + Excel[] excels = attrs.value(); | ||
766 | + for (Excel excel : excels) | ||
767 | + { | ||
768 | + putToField(field, excel); | ||
769 | + } | ||
770 | + } | ||
771 | + } | ||
772 | + } | ||
773 | + | ||
774 | + /** | ||
775 | + * 放到字段集合中 | ||
776 | + */ | ||
777 | + private void putToField(Field field, Excel attr) | ||
778 | + { | ||
779 | + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) | ||
780 | + { | ||
781 | + this.fields.add(new Object[] { field, attr }); | ||
782 | + } | ||
783 | + } | ||
784 | + | ||
785 | + /** | ||
786 | + * 创建一个工作簿 | ||
787 | + */ | ||
788 | + public void createWorkbook() | ||
789 | + { | ||
790 | + this.wb = new SXSSFWorkbook(500); | ||
791 | + } | ||
792 | + | ||
793 | + /** | ||
794 | + * 创建工作表 | ||
795 | + * | ||
796 | + * @param sheetName,指定Sheet名称 | ||
797 | + * @param sheetNo sheet数量 | ||
798 | + * @param index 序号 | ||
799 | + */ | ||
800 | + public void createSheet(double sheetNo, int index) | ||
801 | + { | ||
802 | + this.sheet = wb.createSheet(); | ||
803 | + this.styles = createStyles(wb); | ||
804 | + // 设置工作表的名称. | ||
805 | + if (sheetNo == 0) | ||
806 | + { | ||
807 | + wb.setSheetName(index, sheetName); | ||
808 | + } | ||
809 | + else | ||
810 | + { | ||
811 | + wb.setSheetName(index, sheetName + index); | ||
812 | + } | ||
813 | + } | ||
814 | + | ||
815 | + /** | ||
816 | + * 获取单元格值 | ||
817 | + * | ||
818 | + * @param row 获取的行 | ||
819 | + * @param column 获取单元格列号 | ||
820 | + * @return 单元格值 | ||
821 | + */ | ||
822 | + public Object getCellValue(Row row, int column) | ||
823 | + { | ||
824 | + if (row == null) | ||
825 | + { | ||
826 | + return row; | ||
827 | + } | ||
828 | + Object val = ""; | ||
829 | + try | ||
830 | + { | ||
831 | + Cell cell = row.getCell(column); | ||
832 | + if (cell != null) | ||
833 | + { | ||
834 | + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) | ||
835 | + { | ||
836 | + val = cell.getNumericCellValue(); | ||
837 | + if (HSSFDateUtil.isCellDateFormatted(cell)) | ||
838 | + { | ||
839 | + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 | ||
840 | + } | ||
841 | + else | ||
842 | + { | ||
843 | + if ((Double) val % 1 > 0) | ||
844 | + { | ||
845 | + val = new DecimalFormat("0.00").format(val); | ||
846 | + } | ||
847 | + else | ||
848 | + { | ||
849 | + val = new DecimalFormat("0").format(val); | ||
850 | + } | ||
851 | + } | ||
852 | + } | ||
853 | + else if (cell.getCellTypeEnum() == CellType.STRING) | ||
854 | + { | ||
855 | + val = cell.getStringCellValue(); | ||
856 | + } | ||
857 | + else if (cell.getCellTypeEnum() == CellType.BOOLEAN) | ||
858 | + { | ||
859 | + val = cell.getBooleanCellValue(); | ||
860 | + } | ||
861 | + else if (cell.getCellTypeEnum() == CellType.ERROR) | ||
862 | + { | ||
863 | + val = cell.getErrorCellValue(); | ||
864 | + } | ||
865 | + | ||
866 | + } | ||
867 | + } | ||
868 | + catch (Exception e) | ||
869 | + { | ||
870 | + return val; | ||
871 | + } | ||
872 | + return val; | ||
873 | + } | ||
576 | } | 874 | } |
577 | \ No newline at end of file | 875 | \ No newline at end of file |
src/main/java/com/huaheng/common/utils/reflect/ReflectUtils.java
0 → 100644
1 | +package com.huaheng.common.utils.reflect; | ||
2 | + | ||
3 | +import com.huaheng.common.support.Convert; | ||
4 | +import com.huaheng.common.utils.DateUtils; | ||
5 | +import org.apache.commons.lang3.StringUtils; | ||
6 | +import org.apache.commons.lang3.Validate; | ||
7 | +import org.apache.poi.ss.usermodel.DateUtil; | ||
8 | +import org.slf4j.Logger; | ||
9 | +import org.slf4j.LoggerFactory; | ||
10 | + | ||
11 | +import java.lang.reflect.*; | ||
12 | +import java.util.Date; | ||
13 | + | ||
14 | +/** | ||
15 | + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. | ||
16 | + * | ||
17 | + * @author ruoyi | ||
18 | + */ | ||
19 | +public class ReflectUtils { | ||
20 | + | ||
21 | + private static final String SETTER_PREFIX = "set"; | ||
22 | + | ||
23 | + private static final String GETTER_PREFIX = "get"; | ||
24 | + | ||
25 | + private static final String CGLIB_CLASS_SEPARATOR = "$$"; | ||
26 | + | ||
27 | + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); | ||
28 | + | ||
29 | + /** | ||
30 | + * 调用Getter方法. | ||
31 | + * 支持多级,如:对象名.对象名.方法 | ||
32 | + */ | ||
33 | + @SuppressWarnings("unchecked") | ||
34 | + public static <E> E invokeGetter(Object obj, String propertyName) | ||
35 | + { | ||
36 | + Object object = obj; | ||
37 | + for (String name : StringUtils.split(propertyName, ".")) | ||
38 | + { | ||
39 | + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); | ||
40 | + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); | ||
41 | + } | ||
42 | + return (E) object; | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * 调用Setter方法, 仅匹配方法名。 | ||
47 | + * 支持多级,如:对象名.对象名.方法 | ||
48 | + */ | ||
49 | + public static <E> void invokeSetter(Object obj, String propertyName, E value) | ||
50 | + { | ||
51 | + Object object = obj; | ||
52 | + String[] names = StringUtils.split(propertyName, "."); | ||
53 | + for (int i = 0; i < names.length; i++) | ||
54 | + { | ||
55 | + if (i < names.length - 1) | ||
56 | + { | ||
57 | + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); | ||
58 | + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); | ||
59 | + } | ||
60 | + else | ||
61 | + { | ||
62 | + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); | ||
63 | + invokeMethodByName(object, setterMethodName, new Object[] { value }); | ||
64 | + } | ||
65 | + } | ||
66 | + } | ||
67 | + | ||
68 | + /** | ||
69 | + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. | ||
70 | + */ | ||
71 | + @SuppressWarnings("unchecked") | ||
72 | + public static <E> E getFieldValue(final Object obj, final String fieldName) | ||
73 | + { | ||
74 | + Field field = getAccessibleField(obj, fieldName); | ||
75 | + if (field == null) | ||
76 | + { | ||
77 | + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); | ||
78 | + return null; | ||
79 | + } | ||
80 | + E result = null; | ||
81 | + try | ||
82 | + { | ||
83 | + result = (E) field.get(obj); | ||
84 | + } | ||
85 | + catch (IllegalAccessException e) | ||
86 | + { | ||
87 | + logger.error("不可能抛出的异常{}", e.getMessage()); | ||
88 | + } | ||
89 | + return result; | ||
90 | + } | ||
91 | + | ||
92 | + /** | ||
93 | + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. | ||
94 | + */ | ||
95 | + public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) | ||
96 | + { | ||
97 | + Field field = getAccessibleField(obj, fieldName); | ||
98 | + if (field == null) | ||
99 | + { | ||
100 | + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); | ||
101 | + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); | ||
102 | + return; | ||
103 | + } | ||
104 | + try | ||
105 | + { | ||
106 | + field.set(obj, value); | ||
107 | + } | ||
108 | + catch (IllegalAccessException e) | ||
109 | + { | ||
110 | + logger.error("不可能抛出的异常: {}", e.getMessage()); | ||
111 | + } | ||
112 | + } | ||
113 | + | ||
114 | + /** | ||
115 | + * 直接调用对象方法, 无视private/protected修饰符. | ||
116 | + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. | ||
117 | + * 同时匹配方法名+参数类型, | ||
118 | + */ | ||
119 | + @SuppressWarnings("unchecked") | ||
120 | + public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes, | ||
121 | + final Object[] args) | ||
122 | + { | ||
123 | + if (obj == null || methodName == null) | ||
124 | + { | ||
125 | + return null; | ||
126 | + } | ||
127 | + Method method = getAccessibleMethod(obj, methodName, parameterTypes); | ||
128 | + if (method == null) | ||
129 | + { | ||
130 | + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); | ||
131 | + return null; | ||
132 | + } | ||
133 | + try | ||
134 | + { | ||
135 | + return (E) method.invoke(obj, args); | ||
136 | + } | ||
137 | + catch (Exception e) | ||
138 | + { | ||
139 | + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; | ||
140 | + throw convertReflectionExceptionToUnchecked(msg, e); | ||
141 | + } | ||
142 | + } | ||
143 | + | ||
144 | + /** | ||
145 | + * 直接调用对象方法, 无视private/protected修饰符, | ||
146 | + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. | ||
147 | + * 只匹配函数名,如果有多个同名函数调用第一个。 | ||
148 | + */ | ||
149 | + @SuppressWarnings("unchecked") | ||
150 | + public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) | ||
151 | + { | ||
152 | + Method method = getAccessibleMethodByName(obj, methodName, args.length); | ||
153 | + if (method == null) | ||
154 | + { | ||
155 | + // 如果为空不报错,直接返回空。 | ||
156 | + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); | ||
157 | + return null; | ||
158 | + } | ||
159 | + try | ||
160 | + { | ||
161 | + // 类型转换(将参数数据类型转换为目标方法参数类型) | ||
162 | + Class<?>[] cs = method.getParameterTypes(); | ||
163 | + for (int i = 0; i < cs.length; i++) | ||
164 | + { | ||
165 | + if (args[i] != null && !args[i].getClass().equals(cs[i])) | ||
166 | + { | ||
167 | + if (cs[i] == String.class) | ||
168 | + { | ||
169 | + args[i] = Convert.toStr(args[i]); | ||
170 | + if (StringUtils.endsWith((String) args[i], ".0")) | ||
171 | + { | ||
172 | + args[i] = StringUtils.substringBefore((String) args[i], ".0"); | ||
173 | + } | ||
174 | + } | ||
175 | + else if (cs[i] == Integer.class) | ||
176 | + { | ||
177 | + args[i] = Convert.toInt(args[i]); | ||
178 | + } | ||
179 | + else if (cs[i] == Long.class) | ||
180 | + { | ||
181 | + args[i] = Convert.toLong(args[i]); | ||
182 | + } | ||
183 | + else if (cs[i] == Double.class) | ||
184 | + { | ||
185 | + args[i] = Convert.toDouble(args[i]); | ||
186 | + } | ||
187 | + else if (cs[i] == Float.class) | ||
188 | + { | ||
189 | + args[i] = Convert.toFloat(args[i]); | ||
190 | + } | ||
191 | + else if (cs[i] == Date.class) | ||
192 | + { | ||
193 | + if (args[i] instanceof String) | ||
194 | + { | ||
195 | + args[i] = DateUtils.parseDate(args[i]); | ||
196 | + } | ||
197 | + else | ||
198 | + { | ||
199 | + args[i] = DateUtil.getJavaDate((Double) args[i]); | ||
200 | + } | ||
201 | + } | ||
202 | + } | ||
203 | + } | ||
204 | + return (E) method.invoke(obj, args); | ||
205 | + } | ||
206 | + catch (Exception e) | ||
207 | + { | ||
208 | + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; | ||
209 | + throw convertReflectionExceptionToUnchecked(msg, e); | ||
210 | + } | ||
211 | + } | ||
212 | + | ||
213 | + /** | ||
214 | + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. | ||
215 | + * 如向上转型到Object仍无法找到, 返回null. | ||
216 | + */ | ||
217 | + public static Field getAccessibleField(final Object obj, final String fieldName) | ||
218 | + { | ||
219 | + // 为空不报错。直接返回 null | ||
220 | + if (obj == null) | ||
221 | + { | ||
222 | + return null; | ||
223 | + } | ||
224 | + Validate.notBlank(fieldName, "fieldName can't be blank"); | ||
225 | + for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) | ||
226 | + { | ||
227 | + try | ||
228 | + { | ||
229 | + Field field = superClass.getDeclaredField(fieldName); | ||
230 | + makeAccessible(field); | ||
231 | + return field; | ||
232 | + } | ||
233 | + catch (NoSuchFieldException e) | ||
234 | + { | ||
235 | + continue; | ||
236 | + } | ||
237 | + } | ||
238 | + return null; | ||
239 | + } | ||
240 | + | ||
241 | + /** | ||
242 | + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. | ||
243 | + * 如向上转型到Object仍无法找到, 返回null. | ||
244 | + * 匹配函数名+参数类型。 | ||
245 | + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) | ||
246 | + */ | ||
247 | + public static Method getAccessibleMethod(final Object obj, final String methodName, | ||
248 | + final Class<?>... parameterTypes) | ||
249 | + { | ||
250 | + // 为空不报错。直接返回 null | ||
251 | + if (obj == null) | ||
252 | + { | ||
253 | + return null; | ||
254 | + } | ||
255 | + Validate.notBlank(methodName, "methodName can't be blank"); | ||
256 | + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) | ||
257 | + { | ||
258 | + try | ||
259 | + { | ||
260 | + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); | ||
261 | + makeAccessible(method); | ||
262 | + return method; | ||
263 | + } | ||
264 | + catch (NoSuchMethodException e) | ||
265 | + { | ||
266 | + continue; | ||
267 | + } | ||
268 | + } | ||
269 | + return null; | ||
270 | + } | ||
271 | + | ||
272 | + /** | ||
273 | + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. | ||
274 | + * 如向上转型到Object仍无法找到, 返回null. | ||
275 | + * 只匹配函数名。 | ||
276 | + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) | ||
277 | + */ | ||
278 | + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) | ||
279 | + { | ||
280 | + // 为空不报错。直接返回 null | ||
281 | + if (obj == null) | ||
282 | + { | ||
283 | + return null; | ||
284 | + } | ||
285 | + Validate.notBlank(methodName, "methodName can't be blank"); | ||
286 | + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) | ||
287 | + { | ||
288 | + Method[] methods = searchType.getDeclaredMethods(); | ||
289 | + for (Method method : methods) | ||
290 | + { | ||
291 | + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) | ||
292 | + { | ||
293 | + makeAccessible(method); | ||
294 | + return method; | ||
295 | + } | ||
296 | + } | ||
297 | + } | ||
298 | + return null; | ||
299 | + } | ||
300 | + | ||
301 | + /** | ||
302 | + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 | ||
303 | + */ | ||
304 | + public static void makeAccessible(Method method) | ||
305 | + { | ||
306 | + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) | ||
307 | + && !method.isAccessible()) | ||
308 | + { | ||
309 | + method.setAccessible(true); | ||
310 | + } | ||
311 | + } | ||
312 | + | ||
313 | + /** | ||
314 | + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 | ||
315 | + */ | ||
316 | + public static void makeAccessible(Field field) | ||
317 | + { | ||
318 | + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) | ||
319 | + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) | ||
320 | + { | ||
321 | + field.setAccessible(true); | ||
322 | + } | ||
323 | + } | ||
324 | + | ||
325 | + /** | ||
326 | + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 | ||
327 | + * 如无法找到, 返回Object.class. | ||
328 | + */ | ||
329 | + @SuppressWarnings("unchecked") | ||
330 | + public static <T> Class<T> getClassGenricType(final Class clazz) | ||
331 | + { | ||
332 | + return getClassGenricType(clazz, 0); | ||
333 | + } | ||
334 | + | ||
335 | + /** | ||
336 | + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. | ||
337 | + * 如无法找到, 返回Object.class. | ||
338 | + */ | ||
339 | + public static Class getClassGenricType(final Class clazz, final int index) | ||
340 | + { | ||
341 | + Type genType = clazz.getGenericSuperclass(); | ||
342 | + | ||
343 | + if (!(genType instanceof ParameterizedType)) | ||
344 | + { | ||
345 | + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); | ||
346 | + return Object.class; | ||
347 | + } | ||
348 | + | ||
349 | + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); | ||
350 | + | ||
351 | + if (index >= params.length || index < 0) | ||
352 | + { | ||
353 | + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " | ||
354 | + + params.length); | ||
355 | + return Object.class; | ||
356 | + } | ||
357 | + if (!(params[index] instanceof Class)) | ||
358 | + { | ||
359 | + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); | ||
360 | + return Object.class; | ||
361 | + } | ||
362 | + | ||
363 | + return (Class) params[index]; | ||
364 | + } | ||
365 | + | ||
366 | + public static Class<?> getUserClass(Object instance) | ||
367 | + { | ||
368 | + if (instance == null) | ||
369 | + { | ||
370 | + throw new RuntimeException("Instance must not be null"); | ||
371 | + } | ||
372 | + Class clazz = instance.getClass(); | ||
373 | + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) | ||
374 | + { | ||
375 | + Class<?> superClass = clazz.getSuperclass(); | ||
376 | + if (superClass != null && !Object.class.equals(superClass)) | ||
377 | + { | ||
378 | + return superClass; | ||
379 | + } | ||
380 | + } | ||
381 | + return clazz; | ||
382 | + | ||
383 | + } | ||
384 | + | ||
385 | + /** | ||
386 | + * 将反射时的checked exception转换为unchecked exception. | ||
387 | + */ | ||
388 | + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) | ||
389 | + { | ||
390 | + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException | ||
391 | + || e instanceof NoSuchMethodException) | ||
392 | + { | ||
393 | + return new IllegalArgumentException(msg, e); | ||
394 | + } | ||
395 | + else if (e instanceof InvocationTargetException) | ||
396 | + { | ||
397 | + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); | ||
398 | + } | ||
399 | + return new RuntimeException(msg, e); | ||
400 | + } | ||
401 | +} |
src/main/java/com/huaheng/framework/aspectj/lang/annotation/Excel.java
@@ -17,20 +17,98 @@ public @interface Excel | @@ -17,20 +17,98 @@ public @interface Excel | ||
17 | /** | 17 | /** |
18 | * 导出到Excel中的名字. | 18 | * 导出到Excel中的名字. |
19 | */ | 19 | */ |
20 | - public abstract String name(); | 20 | + public String name() default ""; |
21 | + | ||
22 | + /** | ||
23 | + * 日期格式, 如: yyyy-MM-dd | ||
24 | + */ | ||
25 | + public String dateFormat() default ""; | ||
26 | + | ||
27 | + /** | ||
28 | + * 读取内容转表达式 (如: 0=男,1=女,2=未知) | ||
29 | + */ | ||
30 | + public String readConverterExp() default ""; | ||
31 | + | ||
32 | + /** | ||
33 | + * 导出类型(0数字 1字符串) | ||
34 | + */ | ||
35 | + public ColumnType cellType() default ColumnType.STRING; | ||
36 | + | ||
37 | + /** | ||
38 | + * 导出时在excel中每个列的高度 单位为字符 | ||
39 | + */ | ||
40 | + public double height() default 14; | ||
41 | + | ||
42 | + /** | ||
43 | + * 导出时在excel中每个列的宽 单位为字符 | ||
44 | + */ | ||
45 | + public double width() default 16; | ||
46 | + | ||
47 | + /** | ||
48 | + * 文字后缀,如% 90 变成90% | ||
49 | + */ | ||
50 | + public String suffix() default ""; | ||
51 | + | ||
52 | + /** | ||
53 | + * 当值为空时,字段的默认值 | ||
54 | + */ | ||
55 | + public String defaultValue() default ""; | ||
21 | 56 | ||
22 | /** | 57 | /** |
23 | * 提示信息 | 58 | * 提示信息 |
24 | */ | 59 | */ |
25 | - public abstract String prompt() default ""; | 60 | + public String prompt() default ""; |
26 | 61 | ||
27 | /** | 62 | /** |
28 | * 设置只能选择不能输入的列内容. | 63 | * 设置只能选择不能输入的列内容. |
29 | */ | 64 | */ |
30 | - public abstract String[] combo() default {}; | 65 | + public String[] combo() default {}; |
31 | 66 | ||
32 | /** | 67 | /** |
33 | * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. | 68 | * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. |
34 | */ | 69 | */ |
35 | - public abstract boolean isExport() default true; | 70 | + public boolean isExport() default true; |
71 | + | ||
72 | + /** | ||
73 | + * 另一个类中的属性名称,支持多级获取,以小数点隔开 | ||
74 | + */ | ||
75 | + public String targetAttr() default ""; | ||
76 | + | ||
77 | + /** | ||
78 | + * 字段类型(0:导出导入;1:仅导出;2:仅导入) | ||
79 | + */ | ||
80 | + Type type() default Type.ALL; | ||
81 | + | ||
82 | + public enum Type | ||
83 | + { | ||
84 | + ALL(0), EXPORT(1), IMPORT(2); | ||
85 | + private final int value; | ||
86 | + | ||
87 | + Type(int value) | ||
88 | + { | ||
89 | + this.value = value; | ||
90 | + } | ||
91 | + | ||
92 | + public int value() | ||
93 | + { | ||
94 | + return this.value; | ||
95 | + } | ||
96 | + } | ||
97 | + | ||
98 | + public enum ColumnType | ||
99 | + { | ||
100 | + NUMERIC(0), STRING(1); | ||
101 | + private final int value; | ||
102 | + | ||
103 | + ColumnType(int value) | ||
104 | + { | ||
105 | + this.value = value; | ||
106 | + } | ||
107 | + | ||
108 | + public int value() | ||
109 | + { | ||
110 | + return this.value; | ||
111 | + } | ||
112 | + } | ||
113 | + | ||
36 | } | 114 | } |
37 | \ No newline at end of file | 115 | \ No newline at end of file |
src/main/java/com/huaheng/pc/common/CommonController.java
@@ -4,6 +4,8 @@ import java.io.UnsupportedEncodingException; | @@ -4,6 +4,8 @@ import java.io.UnsupportedEncodingException; | ||
4 | import java.net.URLEncoder; | 4 | import java.net.URLEncoder; |
5 | import javax.servlet.http.HttpServletRequest; | 5 | import javax.servlet.http.HttpServletRequest; |
6 | import javax.servlet.http.HttpServletResponse; | 6 | import javax.servlet.http.HttpServletResponse; |
7 | + | ||
8 | +import com.huaheng.common.config.Global; | ||
7 | import org.slf4j.Logger; | 9 | import org.slf4j.Logger; |
8 | import org.slf4j.LoggerFactory; | 10 | import org.slf4j.LoggerFactory; |
9 | import org.springframework.stereotype.Controller; | 11 | import org.springframework.stereotype.Controller; |
@@ -22,12 +24,11 @@ public class CommonController | @@ -22,12 +24,11 @@ public class CommonController | ||
22 | private static final Logger log = LoggerFactory.getLogger(CommonController.class); | 24 | private static final Logger log = LoggerFactory.getLogger(CommonController.class); |
23 | 25 | ||
24 | @RequestMapping("common/download") | 26 | @RequestMapping("common/download") |
25 | - public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) | ||
26 | - { | ||
27 | - String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); | ||
28 | - try | ||
29 | - { | ||
30 | - String filePath = ResourceUtils.getURL("classpath:").getPath() + "static/file/" + fileName; | 27 | + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { |
28 | + | ||
29 | + try { | ||
30 | + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); | ||
31 | + String filePath = Global.getDownloadPath() + fileName; | ||
31 | 32 | ||
32 | response.setCharacterEncoding("utf-8"); | 33 | response.setCharacterEncoding("utf-8"); |
33 | response.setContentType("multipart/form-data"); | 34 | response.setContentType("multipart/form-data"); |
src/main/java/com/huaheng/pc/config/receiptType/controller/receiptTypeController.java
0 → 100644
1 | +package com.huaheng.pc.config.receiptType.controller; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
4 | +import com.baomidou.mybatisplus.core.metadata.IPage; | ||
5 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||
6 | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||
7 | +import com.huaheng.common.support.Convert; | ||
8 | +import com.huaheng.common.utils.StringUtils; | ||
9 | +import com.huaheng.common.utils.security.ShiroUtils; | ||
10 | +import com.huaheng.framework.aspectj.lang.annotation.Log; | ||
11 | +import com.huaheng.framework.aspectj.lang.constant.BusinessType; | ||
12 | +import com.huaheng.framework.web.controller.BaseController; | ||
13 | +import com.huaheng.framework.web.domain.AjaxResult; | ||
14 | +import com.huaheng.framework.web.page.PageDomain; | ||
15 | +import com.huaheng.framework.web.page.TableDataInfo; | ||
16 | +import com.huaheng.framework.web.page.TableSupport; | ||
17 | +import com.huaheng.pc.config.receiptType.domain.ReceiptType; | ||
18 | +import com.huaheng.pc.config.receiptType.service.ReceiptTypeService; | ||
19 | +import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader; | ||
20 | +import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService; | ||
21 | +import io.swagger.annotations.ApiOperation; | ||
22 | +import io.swagger.annotations.ApiParam; | ||
23 | +import org.apache.shiro.authz.annotation.RequiresPermissions; | ||
24 | +import org.springframework.stereotype.Controller; | ||
25 | +import org.springframework.ui.ModelMap; | ||
26 | +import org.springframework.web.bind.annotation.*; | ||
27 | + | ||
28 | +import javax.annotation.Resource; | ||
29 | +import java.util.ArrayList; | ||
30 | +import java.util.List; | ||
31 | + | ||
32 | +@Controller | ||
33 | +@RequestMapping("/config/receiptType") | ||
34 | +public class receiptTypeController extends BaseController { | ||
35 | + | ||
36 | + @Resource | ||
37 | + private ReceiptTypeService receiptTypeService; | ||
38 | + @Resource | ||
39 | + private ReceiptHeaderService receiptHeaderService; | ||
40 | + | ||
41 | + private String prefix = "config/receiptType"; | ||
42 | + | ||
43 | + @RequiresPermissions("config:receiptType:view") | ||
44 | + @GetMapping() | ||
45 | + public String receiptDetailHistory() { | ||
46 | + return prefix + "/receiptType"; | ||
47 | + } | ||
48 | + | ||
49 | + /** | ||
50 | + * 查询入库类型 | ||
51 | + */ | ||
52 | + @ApiOperation(value="查看入库类型列表", notes="根据编码、类型、创建时间获取入库类型", httpMethod = "POST") | ||
53 | + @RequiresPermissions("config:receiptType:list") | ||
54 | + @Log(title = "入库-入库类型",operating = "入库类型列表", action = BusinessType.GRANT) | ||
55 | + @PostMapping("/list") | ||
56 | + @ResponseBody | ||
57 | + public TableDataInfo list(@ApiParam(name="receiptType",value="编码、类型") ReceiptType receiptType, | ||
58 | + @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin, | ||
59 | + @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) { | ||
60 | + LambdaQueryWrapper<ReceiptType> lambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
61 | + PageDomain pageDomain = TableSupport.buildPageRequest(); | ||
62 | + Integer pageNum = pageDomain.getPageNum(); | ||
63 | + Integer pageSize = pageDomain.getPageSize(); | ||
64 | + lambdaQueryWrapper.gt(StringUtils.isNotEmpty(createdBegin), ReceiptType::getCreated, createdBegin) | ||
65 | + .lt(StringUtils.isNotEmpty(createdEnd), ReceiptType::getCreated, createdEnd) | ||
66 | + .eq(StringUtils.isNotEmpty(receiptType.getCode()), ReceiptType::getCode, receiptType.getCode()) | ||
67 | + .eq(StringUtils.isNotEmpty(receiptType.getReferType()), ReceiptType::getReferType, receiptType.getReferType()) | ||
68 | + .in(ReceiptType::getCompanyCode, ShiroUtils.getCompanyCodeList()) | ||
69 | + .eq(ReceiptType::getWarehouseCode, ShiroUtils.getWarehouseCode()); | ||
70 | + | ||
71 | + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){ | ||
72 | + /*使用分页查询*/ | ||
73 | + Page<ReceiptType> page = new Page<>(pageNum, pageSize); | ||
74 | + IPage<ReceiptType> iPage = receiptTypeService.page(page, lambdaQueryWrapper); | ||
75 | + return getMpDataTable(iPage.getRecords(), iPage.getTotal()); | ||
76 | + } else { | ||
77 | + List<ReceiptType> list = receiptTypeService.list(lambdaQueryWrapper); | ||
78 | + return getDataTable(list); | ||
79 | + } | ||
80 | + } | ||
81 | + | ||
82 | + /** | ||
83 | + * 新增入库类型 | ||
84 | + */ | ||
85 | + @GetMapping("/add") | ||
86 | + public String add() { | ||
87 | + return prefix + "/add"; | ||
88 | + } | ||
89 | + | ||
90 | + /** | ||
91 | + * 新增入库类型 | ||
92 | + */ | ||
93 | + @ApiOperation(value="新增入库类型", notes="新增入库类型", httpMethod = "POST") | ||
94 | + @RequiresPermissions("config:receiptType:add") | ||
95 | + @Log(title = "入库-入库类型",operating = "新增入库类型", action = BusinessType.INSERT) | ||
96 | + @PostMapping("/add") | ||
97 | + @ResponseBody | ||
98 | + public AjaxResult addSave(ReceiptType receiptType) { | ||
99 | + receiptType.setWarehouseCode(ShiroUtils.getWarehouseCode()); | ||
100 | + receiptType.setCreatedBy(ShiroUtils.getLoginName()); | ||
101 | + receiptType.setLastUpdatedBy(ShiroUtils.getLoginName()); | ||
102 | + return toAjax(receiptTypeService.save(receiptType )); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * 修改入库类型 | ||
107 | + */ | ||
108 | + @GetMapping("/edit/{id}") | ||
109 | + public String edit(@PathVariable("id") Integer id, ModelMap mmap) { | ||
110 | + ReceiptType receiptType = receiptTypeService.getById(id); | ||
111 | + mmap.put("receiptType", receiptType); | ||
112 | + return prefix + "/edit"; | ||
113 | + } | ||
114 | + | ||
115 | + /** | ||
116 | + * 修改保存入库类型 | ||
117 | + */ | ||
118 | + @ApiOperation(value="修改入库类型信息", notes="修改入库类型信息", httpMethod = "POST") | ||
119 | + @RequiresPermissions("config:receiptType:edit") | ||
120 | + @Log(title = "入库-入库类型",operating = "修改入库类型", action = BusinessType.UPDATE) | ||
121 | + @PostMapping("/edit") | ||
122 | + @ResponseBody | ||
123 | + public AjaxResult editSave(ReceiptType receiptType) { | ||
124 | + receiptType.setLastUpdatedBy(ShiroUtils.getLoginName()); | ||
125 | + return toAjax(receiptTypeService.updateById(receiptType)); | ||
126 | + } | ||
127 | + | ||
128 | + /** | ||
129 | + * 删除入库 | ||
130 | + */ | ||
131 | + @ApiOperation(value="删除入库信息", notes="单条删除或批量删除入库信息,示例1或1,2,3", httpMethod = "POST") | ||
132 | + @RequiresPermissions("config:receiptType:remove") | ||
133 | + @Log(title = "入库-入库管理",operating = "修改入库", action = BusinessType.DELETE) | ||
134 | + @PostMapping( "/remove") | ||
135 | + @ResponseBody | ||
136 | + public AjaxResult remove(String ids) { | ||
137 | + if (StringUtils.isEmpty(ids)) { | ||
138 | + return AjaxResult.error("id不能为空"); | ||
139 | + } | ||
140 | + List<Integer> list = new ArrayList<>(); | ||
141 | + for (Integer id : Convert.toIntArray(ids)) { | ||
142 | + ReceiptType receiptType = receiptTypeService.getById(id); | ||
143 | + LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery(); | ||
144 | + lambda.eq(ReceiptHeader::getReceiptType, receiptType.getCode()); | ||
145 | + List<ReceiptHeader> receiptHeaderList = receiptHeaderService.list(lambda); | ||
146 | + if (receiptHeaderList.size() == 0){ | ||
147 | + list.add(id); | ||
148 | + } else { | ||
149 | + return AjaxResult.error("类型"+receiptType.getCode()+"存在入库单,不能删除"); | ||
150 | + } | ||
151 | + } | ||
152 | + return toAjax(receiptTypeService.removeByIds(list)); | ||
153 | + } | ||
154 | +} |
src/main/java/com/huaheng/pc/receipt/receiptType/domain/ReceiptType.java renamed to src/main/java/com/huaheng/pc/config/receiptType/domain/ReceiptType.java
1 | -package com.huaheng.pc.receipt.receiptType.domain; | 1 | +package com.huaheng.pc.config.receiptType.domain; |
2 | 2 | ||
3 | import com.baomidou.mybatisplus.annotation.IdType; | 3 | import com.baomidou.mybatisplus.annotation.IdType; |
4 | import com.baomidou.mybatisplus.annotation.TableField; | 4 | import com.baomidou.mybatisplus.annotation.TableField; |
@@ -6,10 +6,11 @@ import com.baomidou.mybatisplus.annotation.TableId; | @@ -6,10 +6,11 @@ import com.baomidou.mybatisplus.annotation.TableId; | ||
6 | import com.baomidou.mybatisplus.annotation.TableName; | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
7 | import io.swagger.annotations.ApiModel; | 7 | import io.swagger.annotations.ApiModel; |
8 | import io.swagger.annotations.ApiModelProperty; | 8 | import io.swagger.annotations.ApiModelProperty; |
9 | + | ||
9 | import java.io.Serializable; | 10 | import java.io.Serializable; |
10 | import java.util.Date; | 11 | import java.util.Date; |
11 | 12 | ||
12 | -@ApiModel(value="com.huaheng.pc.receipt.receiptType.domain.ReceiptType") | 13 | +@ApiModel(value="com.huaheng.pc.config.receiptType.domain.ReceiptType") |
13 | @TableName(value = "receipt_type") | 14 | @TableName(value = "receipt_type") |
14 | public class ReceiptType implements Serializable { | 15 | public class ReceiptType implements Serializable { |
15 | /** | 16 | /** |
@@ -59,7 +60,7 @@ public class ReceiptType implements Serializable { | @@ -59,7 +60,7 @@ public class ReceiptType implements Serializable { | ||
59 | */ | 60 | */ |
60 | @TableField(value = "enable") | 61 | @TableField(value = "enable") |
61 | @ApiModelProperty(value="是否启用") | 62 | @ApiModelProperty(value="是否启用") |
62 | - private String enable; | 63 | + private Boolean enable; |
63 | 64 | ||
64 | /** | 65 | /** |
65 | * 创建时间 | 66 | * 创建时间 |
@@ -314,7 +315,7 @@ public class ReceiptType implements Serializable { | @@ -314,7 +315,7 @@ public class ReceiptType implements Serializable { | ||
314 | * | 315 | * |
315 | * @return enable - 是否启用 | 316 | * @return enable - 是否启用 |
316 | */ | 317 | */ |
317 | - public String getEnable() { | 318 | + public Boolean getEnable() { |
318 | return enable; | 319 | return enable; |
319 | } | 320 | } |
320 | 321 | ||
@@ -323,7 +324,7 @@ public class ReceiptType implements Serializable { | @@ -323,7 +324,7 @@ public class ReceiptType implements Serializable { | ||
323 | * | 324 | * |
324 | * @param enable 是否启用 | 325 | * @param enable 是否启用 |
325 | */ | 326 | */ |
326 | - public void setEnable(String enable) { | 327 | + public void setEnable(Boolean enable) { |
327 | this.enable = enable; | 328 | this.enable = enable; |
328 | } | 329 | } |
329 | 330 |
src/main/java/com/huaheng/pc/receipt/receiptType/mapper/ReceiptTypeMapper.java renamed to src/main/java/com/huaheng/pc/config/receiptType/mapper/ReceiptTypeMapper.java
1 | -package com.huaheng.pc.receipt.receiptType.mapper; | 1 | +package com.huaheng.pc.config.receiptType.mapper; |
2 | 2 | ||
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
4 | -import com.huaheng.pc.receipt.receiptType.domain.ReceiptType; | 4 | +import com.huaheng.pc.config.receiptType.domain.ReceiptType; |
5 | 5 | ||
6 | public interface ReceiptTypeMapper extends BaseMapper<ReceiptType> { | 6 | public interface ReceiptTypeMapper extends BaseMapper<ReceiptType> { |
7 | } | 7 | } |
8 | \ No newline at end of file | 8 | \ No newline at end of file |
src/main/java/com/huaheng/pc/receipt/receiptType/service/ReceiptTypeService.java renamed to src/main/java/com/huaheng/pc/config/receiptType/service/ReceiptTypeService.java
1 | -package com.huaheng.pc.receipt.receiptType.service; | 1 | +package com.huaheng.pc.config.receiptType.service; |
2 | 2 | ||
3 | -import com.huaheng.pc.receipt.receiptType.domain.ReceiptType; | ||
4 | import com.baomidou.mybatisplus.extension.service.IService; | 3 | import com.baomidou.mybatisplus.extension.service.IService; |
4 | +import com.huaheng.pc.config.receiptType.domain.ReceiptType; | ||
5 | + | ||
5 | public interface ReceiptTypeService extends IService<ReceiptType>{ | 6 | public interface ReceiptTypeService extends IService<ReceiptType>{ |
6 | 7 | ||
7 | 8 |
src/main/java/com/huaheng/pc/config/receiptType/service/ReceiptTypeServiceImpl.java
0 → 100644
1 | +package com.huaheng.pc.config.receiptType.service; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
4 | +import com.huaheng.pc.config.receiptType.domain.ReceiptType; | ||
5 | +import com.huaheng.pc.config.receiptType.mapper.ReceiptTypeMapper; | ||
6 | +import org.springframework.stereotype.Service; | ||
7 | + | ||
8 | +@Service | ||
9 | +public class ReceiptTypeServiceImpl extends ServiceImpl<ReceiptTypeMapper, ReceiptType> implements ReceiptTypeService { | ||
10 | + | ||
11 | +} |
src/main/java/com/huaheng/pc/general/carrier/controller/CarrierController.java
0 → 100644
1 | +package com.huaheng.pc.general.carrier.controller; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
4 | +import com.baomidou.mybatisplus.core.metadata.IPage; | ||
5 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||
6 | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||
7 | +import com.huaheng.common.support.Convert; | ||
8 | +import com.huaheng.common.utils.StringUtils; | ||
9 | +import com.huaheng.common.utils.security.ShiroUtils; | ||
10 | +import com.huaheng.framework.aspectj.lang.annotation.Log; | ||
11 | +import com.huaheng.framework.aspectj.lang.constant.BusinessType; | ||
12 | +import com.huaheng.framework.web.controller.BaseController; | ||
13 | +import com.huaheng.framework.web.domain.AjaxResult; | ||
14 | +import com.huaheng.framework.web.page.PageDomain; | ||
15 | +import com.huaheng.framework.web.page.TableDataInfo; | ||
16 | +import com.huaheng.framework.web.page.TableSupport; | ||
17 | +import com.huaheng.pc.general.carrier.domain.Carrier; | ||
18 | +import com.huaheng.pc.general.carrier.service.CarrierService; | ||
19 | +import io.swagger.annotations.ApiOperation; | ||
20 | +import io.swagger.annotations.ApiParam; | ||
21 | +import org.apache.shiro.authz.annotation.RequiresPermissions; | ||
22 | +import org.springframework.stereotype.Controller; | ||
23 | +import org.springframework.ui.ModelMap; | ||
24 | +import org.springframework.web.bind.annotation.*; | ||
25 | + | ||
26 | +import javax.annotation.Resource; | ||
27 | +import java.util.ArrayList; | ||
28 | +import java.util.List; | ||
29 | + | ||
30 | +/** | ||
31 | + * 承运商 | ||
32 | + */ | ||
33 | +@Controller | ||
34 | +@RequestMapping("/general/carrier") | ||
35 | +public class CarrierController extends BaseController { | ||
36 | + | ||
37 | + private String prefix = "general/carrier"; | ||
38 | + | ||
39 | + @Resource | ||
40 | + private CarrierService carrierService; | ||
41 | + | ||
42 | + @RequiresPermissions("general:carrier:view") | ||
43 | + @GetMapping() | ||
44 | + public String bomHeader() { | ||
45 | + return prefix + "/carrier"; | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * 查询承运商列表 | ||
50 | + */ | ||
51 | + @ApiOperation(value="查看承运商列表", notes="根据承运商编码、名称、创建时间获取承运商信息", httpMethod = "POST") | ||
52 | + @RequiresPermissions("general:carrier:list") | ||
53 | + @Log(title = "通用-承运商管理", operating = "查看承运商列表", action = BusinessType.GRANT) | ||
54 | + @PostMapping("/list") | ||
55 | + @ResponseBody | ||
56 | + public TableDataInfo list( | ||
57 | + @ApiParam(name="carrier",value="承运商编码、名称") Carrier carrier, | ||
58 | + @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin, | ||
59 | + @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) { | ||
60 | + LambdaQueryWrapper<Carrier> lambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
61 | + PageDomain pageDomain = TableSupport.buildPageRequest(); | ||
62 | + Integer pageNum = pageDomain.getPageNum(); | ||
63 | + Integer pageSize = pageDomain.getPageSize(); | ||
64 | + lambdaQueryWrapper.gt(StringUtils.isNotEmpty(createdBegin), Carrier::getCreated, createdBegin) | ||
65 | + .lt(StringUtils.isNotEmpty(createdEnd), Carrier::getCreated, createdEnd) | ||
66 | + .eq(StringUtils.isNotEmpty(carrier.getCode()), Carrier::getCode, carrier.getCode()) | ||
67 | + .eq(StringUtils.isNotEmpty(carrier.getName()), Carrier::getName, carrier.getName()) | ||
68 | + .eq(Carrier::getWarehouseCode, ShiroUtils.getWarehouseCode()); | ||
69 | + | ||
70 | + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){ | ||
71 | + /*使用分页查询*/ | ||
72 | + Page<Carrier> page = new Page<>(pageNum, pageSize); | ||
73 | + IPage<Carrier> iPage = carrierService.page(page, lambdaQueryWrapper); | ||
74 | + return getMpDataTable(iPage.getRecords(), iPage.getTotal()); | ||
75 | + } else { | ||
76 | + List<Carrier> list = carrierService.list(lambdaQueryWrapper); | ||
77 | + return getDataTable(list); | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * 新增承运商 | ||
83 | + */ | ||
84 | + @GetMapping("/add") | ||
85 | + public String add() { | ||
86 | + return prefix + "/add"; | ||
87 | + } | ||
88 | + | ||
89 | + /** | ||
90 | + * 新增保存承运商 | ||
91 | + */ | ||
92 | + @ApiOperation(value="新增承运商", notes="新增承运商", httpMethod = "POST") | ||
93 | + @RequiresPermissions("general:carrier:add") | ||
94 | + @Log(title = "通用-承运商", operating = "新增承运商", action = BusinessType.INSERT) | ||
95 | + @PostMapping("/add") | ||
96 | + @ResponseBody | ||
97 | + public AjaxResult addSave(@ApiParam(name = "containerType", value = "承运商", required = true) | ||
98 | + Carrier carrier) { | ||
99 | + carrier.setWarehouseCode(ShiroUtils.getWarehouseCode()); | ||
100 | + carrier.setCreatedBy(ShiroUtils.getLoginName()); | ||
101 | + carrier.setLastUpdatedBy(ShiroUtils.getLoginName()); | ||
102 | + return toAjax(carrierService.save(carrier)); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * 修改承运商 | ||
107 | + */ | ||
108 | + @GetMapping("/edit/{id}") | ||
109 | + public String edit(@PathVariable("id") Integer id, ModelMap mmap) { | ||
110 | + mmap.put("carrier", carrierService.getById(id)); | ||
111 | + return prefix + "/edit"; | ||
112 | + } | ||
113 | + | ||
114 | + /** | ||
115 | + * 修改保存承运商 | ||
116 | + */ | ||
117 | + @ApiOperation(value="修改承运商", notes="修改承运商", httpMethod = "POST") | ||
118 | + @RequiresPermissions("general:carrier:edit") | ||
119 | + @Log(title = "通用-承运商", operating = "修改承运商", action = BusinessType.UPDATE) | ||
120 | + @PostMapping("/edit") | ||
121 | + @ResponseBody | ||
122 | + public AjaxResult editSave( | ||
123 | + @ApiParam(name = "carrier", value = "承运商", required = true)Carrier carrier) { | ||
124 | + carrier.setLastUpdatedBy(ShiroUtils.getLoginName()); | ||
125 | + return toAjax(carrierService.updateById(carrier)); | ||
126 | + } | ||
127 | + | ||
128 | + /** | ||
129 | + * 删除承运商 | ||
130 | + */ | ||
131 | + @ApiOperation(value="删除承运商", notes="根据id批量删除承运商,参数示例1,2,3", httpMethod = "POST") | ||
132 | + @RequiresPermissions("general:carrier:remove") | ||
133 | + @Log(title = "通用-承运商", operating = "删除承运商", action = BusinessType.DELETE) | ||
134 | + @PostMapping( "/remove") | ||
135 | + @ResponseBody | ||
136 | + public AjaxResult remove(String ids) { | ||
137 | + if (StringUtils.isEmpty(ids)){ | ||
138 | + return AjaxResult.error("id不能为空"); | ||
139 | + } | ||
140 | + List<Integer> list = new ArrayList<>(); | ||
141 | + for (Integer id : Convert.toIntArray(ids)) { | ||
142 | + list.add(id); | ||
143 | + } | ||
144 | + return toAjax(carrierService.removeByIds(list)); | ||
145 | + } | ||
146 | +} |
src/main/java/com/huaheng/pc/general/material/controller/MaterialController.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||
6 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 6 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
7 | import com.huaheng.common.support.Convert; | 7 | import com.huaheng.common.support.Convert; |
8 | import com.huaheng.common.utils.StringUtils; | 8 | import com.huaheng.common.utils.StringUtils; |
9 | +import com.huaheng.common.utils.poi.ExcelUtil; | ||
9 | import com.huaheng.common.utils.security.ShiroUtils; | 10 | import com.huaheng.common.utils.security.ShiroUtils; |
10 | import com.huaheng.framework.aspectj.lang.annotation.Log; | 11 | import com.huaheng.framework.aspectj.lang.annotation.Log; |
11 | import com.huaheng.framework.aspectj.lang.constant.BusinessType; | 12 | import com.huaheng.framework.aspectj.lang.constant.BusinessType; |
@@ -28,6 +29,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; | @@ -28,6 +29,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; | ||
28 | import org.springframework.stereotype.Controller; | 29 | import org.springframework.stereotype.Controller; |
29 | import org.springframework.ui.ModelMap; | 30 | import org.springframework.ui.ModelMap; |
30 | import org.springframework.web.bind.annotation.*; | 31 | import org.springframework.web.bind.annotation.*; |
32 | +import org.springframework.web.multipart.MultipartFile; | ||
31 | 33 | ||
32 | import javax.annotation.Resource; | 34 | import javax.annotation.Resource; |
33 | import java.util.List; | 35 | import java.util.List; |
@@ -179,4 +181,23 @@ public class MaterialController extends BaseController { | @@ -179,4 +181,23 @@ public class MaterialController extends BaseController { | ||
179 | } | 181 | } |
180 | } | 182 | } |
181 | 183 | ||
184 | + @PostMapping("/importData") | ||
185 | + @ResponseBody | ||
186 | + public AjaxResult importData(MultipartFile file) throws Exception { | ||
187 | + ExcelUtil<Material> util = new ExcelUtil<>(Material.class); | ||
188 | + List<Material> materialList = util.importExcel(file.getInputStream()); | ||
189 | + String operName = ShiroUtils.getLoginName(); | ||
190 | + Boolean updateSupport = false; | ||
191 | + String message = materialService.importMaterial(materialList, updateSupport, operName); | ||
192 | + return AjaxResult.success(message); | ||
193 | + } | ||
194 | + | ||
195 | + @GetMapping("/importTemplate") | ||
196 | + @ResponseBody | ||
197 | + public AjaxResult importTemplate() { | ||
198 | + ExcelUtil<Material> util = new ExcelUtil<>(Material.class); | ||
199 | + return util.importTemplateExcel("物料"); | ||
200 | + } | ||
201 | + | ||
202 | + | ||
182 | } | 203 | } |
src/main/java/com/huaheng/pc/general/material/domain/Material.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; | @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; | ||
4 | import com.baomidou.mybatisplus.annotation.TableField; | 4 | import com.baomidou.mybatisplus.annotation.TableField; |
5 | import com.baomidou.mybatisplus.annotation.TableId; | 5 | import com.baomidou.mybatisplus.annotation.TableId; |
6 | import com.baomidou.mybatisplus.annotation.TableName; | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
7 | +import com.huaheng.framework.aspectj.lang.annotation.Excel; | ||
7 | import io.swagger.annotations.ApiModel; | 8 | import io.swagger.annotations.ApiModel; |
8 | import io.swagger.annotations.ApiModelProperty; | 9 | import io.swagger.annotations.ApiModelProperty; |
9 | import java.io.Serializable; | 10 | import java.io.Serializable; |
@@ -17,8 +18,9 @@ public class Material implements Serializable { | @@ -17,8 +18,9 @@ public class Material implements Serializable { | ||
17 | /** | 18 | /** |
18 | * ID | 19 | * ID |
19 | */ | 20 | */ |
20 | - @TableId(value = "id", type = IdType.AUTO) | 21 | + @TableId(value = "id", type = IdType.AUTO) |
21 | @ApiModelProperty(value="ID") | 22 | @ApiModelProperty(value="ID") |
23 | + @Excel(name = "ID") | ||
22 | private Integer id; | 24 | private Integer id; |
23 | 25 | ||
24 | /** | 26 | /** |
@@ -26,6 +28,7 @@ public class Material implements Serializable { | @@ -26,6 +28,7 @@ public class Material implements Serializable { | ||
26 | */ | 28 | */ |
27 | @TableField(value = "code") | 29 | @TableField(value = "code") |
28 | @ApiModelProperty(value="物料编码") | 30 | @ApiModelProperty(value="物料编码") |
31 | + @Excel(name = "物料编码") | ||
29 | private String code; | 32 | private String code; |
30 | 33 | ||
31 | /** | 34 | /** |
@@ -33,6 +36,7 @@ public class Material implements Serializable { | @@ -33,6 +36,7 @@ public class Material implements Serializable { | ||
33 | */ | 36 | */ |
34 | @TableField(value = "companyCode") | 37 | @TableField(value = "companyCode") |
35 | @ApiModelProperty(value="货主编码") | 38 | @ApiModelProperty(value="货主编码") |
39 | + @Excel(name = "货主编码") | ||
36 | private String companyCode; | 40 | private String companyCode; |
37 | 41 | ||
38 | /** | 42 | /** |
@@ -40,6 +44,7 @@ public class Material implements Serializable { | @@ -40,6 +44,7 @@ public class Material implements Serializable { | ||
40 | */ | 44 | */ |
41 | @TableField(value = "warehouseCode") | 45 | @TableField(value = "warehouseCode") |
42 | @ApiModelProperty(value="仓库编码") | 46 | @ApiModelProperty(value="仓库编码") |
47 | + @Excel(name = "仓库编码") | ||
43 | private String warehouseCode; | 48 | private String warehouseCode; |
44 | 49 | ||
45 | /** | 50 | /** |
@@ -47,6 +52,7 @@ public class Material implements Serializable { | @@ -47,6 +52,7 @@ public class Material implements Serializable { | ||
47 | */ | 52 | */ |
48 | @TableField(value = "name") | 53 | @TableField(value = "name") |
49 | @ApiModelProperty(value="名称") | 54 | @ApiModelProperty(value="名称") |
55 | + @Excel(name = "名称") | ||
50 | private String name; | 56 | private String name; |
51 | 57 | ||
52 | /** | 58 | /** |
@@ -54,6 +60,7 @@ public class Material implements Serializable { | @@ -54,6 +60,7 @@ public class Material implements Serializable { | ||
54 | */ | 60 | */ |
55 | @TableField(value = "spec") | 61 | @TableField(value = "spec") |
56 | @ApiModelProperty(value="规格") | 62 | @ApiModelProperty(value="规格") |
63 | + @Excel(name = "规格") | ||
57 | private String spec; | 64 | private String spec; |
58 | 65 | ||
59 | /** | 66 | /** |
@@ -61,6 +68,7 @@ public class Material implements Serializable { | @@ -61,6 +68,7 @@ public class Material implements Serializable { | ||
61 | */ | 68 | */ |
62 | @TableField(value = "unit") | 69 | @TableField(value = "unit") |
63 | @ApiModelProperty(value="单位") | 70 | @ApiModelProperty(value="单位") |
71 | + @Excel(name = "单位") | ||
64 | private String unit; | 72 | private String unit; |
65 | 73 | ||
66 | /** | 74 | /** |
@@ -68,6 +76,7 @@ public class Material implements Serializable { | @@ -68,6 +76,7 @@ public class Material implements Serializable { | ||
68 | */ | 76 | */ |
69 | @TableField(value = "type") | 77 | @TableField(value = "type") |
70 | @ApiModelProperty(value="类别") | 78 | @ApiModelProperty(value="类别") |
79 | + @Excel(name = "类别") | ||
71 | private String type; | 80 | private String type; |
72 | 81 | ||
73 | /** | 82 | /** |
@@ -75,6 +84,7 @@ public class Material implements Serializable { | @@ -75,6 +84,7 @@ public class Material implements Serializable { | ||
75 | */ | 84 | */ |
76 | @TableField(value = "abcClass") | 85 | @TableField(value = "abcClass") |
77 | @ApiModelProperty(value="ABC分类") | 86 | @ApiModelProperty(value="ABC分类") |
87 | + @Excel(name = "ABC分类") | ||
78 | private String abcClass; | 88 | private String abcClass; |
79 | 89 | ||
80 | /** | 90 | /** |
@@ -82,6 +92,7 @@ public class Material implements Serializable { | @@ -82,6 +92,7 @@ public class Material implements Serializable { | ||
82 | */ | 92 | */ |
83 | @TableField(value = "daysToExpire") | 93 | @TableField(value = "daysToExpire") |
84 | @ApiModelProperty(value="保质期(天)") | 94 | @ApiModelProperty(value="保质期(天)") |
95 | + @Excel(name = "保质期(天)") | ||
85 | private Integer daysToExpire; | 96 | private Integer daysToExpire; |
86 | 97 | ||
87 | /** | 98 | /** |
@@ -89,6 +100,7 @@ public class Material implements Serializable { | @@ -89,6 +100,7 @@ public class Material implements Serializable { | ||
89 | */ | 100 | */ |
90 | @TableField(value = "locatingRule") | 101 | @TableField(value = "locatingRule") |
91 | @ApiModelProperty(value="定位规则") | 102 | @ApiModelProperty(value="定位规则") |
103 | + @Excel(name = "定位规则") | ||
92 | private String locatingRule; | 104 | private String locatingRule; |
93 | 105 | ||
94 | /** | 106 | /** |
@@ -96,6 +108,7 @@ public class Material implements Serializable { | @@ -96,6 +108,7 @@ public class Material implements Serializable { | ||
96 | */ | 108 | */ |
97 | @TableField(value = "allocationRule") | 109 | @TableField(value = "allocationRule") |
98 | @ApiModelProperty(value="分配规则") | 110 | @ApiModelProperty(value="分配规则") |
111 | + @Excel(name = "分配规则") | ||
99 | private String allocationRule; | 112 | private String allocationRule; |
100 | 113 | ||
101 | /** | 114 | /** |
@@ -103,6 +116,7 @@ public class Material implements Serializable { | @@ -103,6 +116,7 @@ public class Material implements Serializable { | ||
103 | */ | 116 | */ |
104 | @TableField(value = "replenishmentRule") | 117 | @TableField(value = "replenishmentRule") |
105 | @ApiModelProperty(value="补货规则") | 118 | @ApiModelProperty(value="补货规则") |
119 | + @Excel(name = "补货规则") | ||
106 | private String replenishmentRule; | 120 | private String replenishmentRule; |
107 | 121 | ||
108 | /** | 122 | /** |
@@ -110,6 +124,7 @@ public class Material implements Serializable { | @@ -110,6 +124,7 @@ public class Material implements Serializable { | ||
110 | */ | 124 | */ |
111 | @TableField(value = "emptyLocRule") | 125 | @TableField(value = "emptyLocRule") |
112 | @ApiModelProperty(value="空货位规则") | 126 | @ApiModelProperty(value="空货位规则") |
127 | + @Excel(name = "空货位规则") | ||
113 | private String emptyLocRule; | 128 | private String emptyLocRule; |
114 | 129 | ||
115 | /** | 130 | /** |
@@ -117,6 +132,7 @@ public class Material implements Serializable { | @@ -117,6 +132,7 @@ public class Material implements Serializable { | ||
117 | */ | 132 | */ |
118 | @TableField(value = "receivingFlow") | 133 | @TableField(value = "receivingFlow") |
119 | @ApiModelProperty(value="入库流程") | 134 | @ApiModelProperty(value="入库流程") |
135 | + @Excel(name = "入库流程") | ||
120 | private String receivingFlow; | 136 | private String receivingFlow; |
121 | 137 | ||
122 | /** | 138 | /** |
@@ -124,6 +140,7 @@ public class Material implements Serializable { | @@ -124,6 +140,7 @@ public class Material implements Serializable { | ||
124 | */ | 140 | */ |
125 | @TableField(value = "shippingFlow") | 141 | @TableField(value = "shippingFlow") |
126 | @ApiModelProperty(value="出库流程") | 142 | @ApiModelProperty(value="出库流程") |
143 | + @Excel(name = "出库流程") | ||
127 | private String shippingFlow; | 144 | private String shippingFlow; |
128 | 145 | ||
129 | /** | 146 | /** |
@@ -131,6 +148,7 @@ public class Material implements Serializable { | @@ -131,6 +148,7 @@ public class Material implements Serializable { | ||
131 | */ | 148 | */ |
132 | @TableField(value = "attributeTemplateCode") | 149 | @TableField(value = "attributeTemplateCode") |
133 | @ApiModelProperty(value="属性模版") | 150 | @ApiModelProperty(value="属性模版") |
151 | + @Excel(name = "属性模版") | ||
134 | private String attributeTemplateCode; | 152 | private String attributeTemplateCode; |
135 | 153 | ||
136 | /** | 154 | /** |
@@ -138,6 +156,7 @@ public class Material implements Serializable { | @@ -138,6 +156,7 @@ public class Material implements Serializable { | ||
138 | */ | 156 | */ |
139 | @TableField(value = "trackSerialNum") | 157 | @TableField(value = "trackSerialNum") |
140 | @ApiModelProperty(value="记录序列号") | 158 | @ApiModelProperty(value="记录序列号") |
159 | + @Excel(name = "记录序列号") | ||
141 | private Integer trackSerialNum; | 160 | private Integer trackSerialNum; |
142 | 161 | ||
143 | /** | 162 | /** |
@@ -145,6 +164,7 @@ public class Material implements Serializable { | @@ -145,6 +164,7 @@ public class Material implements Serializable { | ||
145 | */ | 164 | */ |
146 | @TableField(value = "autoGenSerialNum") | 165 | @TableField(value = "autoGenSerialNum") |
147 | @ApiModelProperty(value="自动生成序列号") | 166 | @ApiModelProperty(value="自动生成序列号") |
167 | + @Excel(name = "自动生成序列号") | ||
148 | private Integer autoGenSerialNum; | 168 | private Integer autoGenSerialNum; |
149 | 169 | ||
150 | /** | 170 | /** |
@@ -152,6 +172,7 @@ public class Material implements Serializable { | @@ -152,6 +172,7 @@ public class Material implements Serializable { | ||
152 | */ | 172 | */ |
153 | @TableField(value = "autoGenSerialNumFormat") | 173 | @TableField(value = "autoGenSerialNumFormat") |
154 | @ApiModelProperty(value="自动生成序列号表达式") | 174 | @ApiModelProperty(value="自动生成序列号表达式") |
175 | + @Excel(name = "自动生成序列号表达式") | ||
155 | private String autoGenSerialNumFormat; | 176 | private String autoGenSerialNumFormat; |
156 | 177 | ||
157 | /** | 178 | /** |
@@ -159,6 +180,7 @@ public class Material implements Serializable { | @@ -159,6 +180,7 @@ public class Material implements Serializable { | ||
159 | */ | 180 | */ |
160 | @TableField(value = "snTemplateCode") | 181 | @TableField(value = "snTemplateCode") |
161 | @ApiModelProperty(value="序列号模版") | 182 | @ApiModelProperty(value="序列号模版") |
183 | + @Excel(name = "序列号模版") | ||
162 | private String snTemplateCode; | 184 | private String snTemplateCode; |
163 | 185 | ||
164 | /** | 186 | /** |
@@ -166,6 +188,7 @@ public class Material implements Serializable { | @@ -166,6 +188,7 @@ public class Material implements Serializable { | ||
166 | */ | 188 | */ |
167 | @TableField(value = "expiringDays") | 189 | @TableField(value = "expiringDays") |
168 | @ApiModelProperty(value="临期预警天数") | 190 | @ApiModelProperty(value="临期预警天数") |
191 | + @Excel(name = "临期预警天数") | ||
169 | private Integer expiringDays; | 192 | private Integer expiringDays; |
170 | 193 | ||
171 | /** | 194 | /** |
@@ -173,6 +196,7 @@ public class Material implements Serializable { | @@ -173,6 +196,7 @@ public class Material implements Serializable { | ||
173 | */ | 196 | */ |
174 | @TableField(value = "minShelfLifeDays") | 197 | @TableField(value = "minShelfLifeDays") |
175 | @ApiModelProperty(value="收货预警天数") | 198 | @ApiModelProperty(value="收货预警天数") |
199 | + @Excel(name = "收货预警天数") | ||
176 | private Integer minShelfLifeDays; | 200 | private Integer minShelfLifeDays; |
177 | 201 | ||
178 | /** | 202 | /** |
@@ -194,6 +218,7 @@ public class Material implements Serializable { | @@ -194,6 +218,7 @@ public class Material implements Serializable { | ||
194 | */ | 218 | */ |
195 | @TableField(value = "createdBy") | 219 | @TableField(value = "createdBy") |
196 | @ApiModelProperty(value="创建用户") | 220 | @ApiModelProperty(value="创建用户") |
221 | + | ||
197 | private String createdBy; | 222 | private String createdBy; |
198 | 223 | ||
199 | /** | 224 | /** |
@@ -215,6 +240,7 @@ public class Material implements Serializable { | @@ -215,6 +240,7 @@ public class Material implements Serializable { | ||
215 | */ | 240 | */ |
216 | @TableField(value = "version") | 241 | @TableField(value = "version") |
217 | @ApiModelProperty(value="数据版本") | 242 | @ApiModelProperty(value="数据版本") |
243 | + @Excel(name = "数据版本") | ||
218 | private Integer version; | 244 | private Integer version; |
219 | 245 | ||
220 | /** | 246 | /** |
@@ -222,6 +248,7 @@ public class Material implements Serializable { | @@ -222,6 +248,7 @@ public class Material implements Serializable { | ||
222 | */ | 248 | */ |
223 | @TableField(value = "userDef1") | 249 | @TableField(value = "userDef1") |
224 | @ApiModelProperty(value="是否AGV区域发货") | 250 | @ApiModelProperty(value="是否AGV区域发货") |
251 | + @Excel(name = "是否AGV区域发货") | ||
225 | private String userDef1; | 252 | private String userDef1; |
226 | 253 | ||
227 | /** | 254 | /** |
src/main/java/com/huaheng/pc/general/material/service/MaterialService.java
@@ -3,8 +3,15 @@ package com.huaheng.pc.general.material.service; | @@ -3,8 +3,15 @@ package com.huaheng.pc.general.material.service; | ||
3 | import com.huaheng.framework.web.domain.AjaxResult; | 3 | import com.huaheng.framework.web.domain.AjaxResult; |
4 | import com.huaheng.pc.general.material.domain.Material; | 4 | import com.huaheng.pc.general.material.domain.Material; |
5 | import com.baomidou.mybatisplus.extension.service.IService; | 5 | import com.baomidou.mybatisplus.extension.service.IService; |
6 | + | ||
7 | +import java.util.List; | ||
8 | + | ||
6 | public interface MaterialService extends IService<Material>{ | 9 | public interface MaterialService extends IService<Material>{ |
7 | 10 | ||
8 | AjaxResult removeByIds(String ids); | 11 | AjaxResult removeByIds(String ids); |
9 | 12 | ||
13 | + | ||
14 | + public String importMaterial(List<Material> materialList, Boolean updateSupport,String operName); | ||
15 | + | ||
16 | + | ||
10 | } | 17 | } |
src/main/java/com/huaheng/pc/general/material/service/MaterialServiceImpl.java
@@ -2,7 +2,9 @@ package com.huaheng.pc.general.material.service; | @@ -2,7 +2,9 @@ package com.huaheng.pc.general.material.service; | ||
2 | 2 | ||
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
5 | +import com.huaheng.common.exception.BusinessException; | ||
5 | import com.huaheng.common.support.Convert; | 6 | import com.huaheng.common.support.Convert; |
7 | +import com.huaheng.common.utils.StringUtils; | ||
6 | import com.huaheng.common.utils.security.ShiroUtils; | 8 | import com.huaheng.common.utils.security.ShiroUtils; |
7 | import com.huaheng.framework.web.domain.AjaxResult; | 9 | import com.huaheng.framework.web.domain.AjaxResult; |
8 | import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; | 10 | import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; |
@@ -16,6 +18,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | @@ -16,6 +18,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
16 | import com.huaheng.pc.general.material.mapper.MaterialMapper; | 18 | import com.huaheng.pc.general.material.mapper.MaterialMapper; |
17 | import com.huaheng.pc.general.material.domain.Material; | 19 | import com.huaheng.pc.general.material.domain.Material; |
18 | import com.huaheng.pc.general.material.service.MaterialService; | 20 | import com.huaheng.pc.general.material.service.MaterialService; |
21 | +import org.springframework.transaction.annotation.Transactional; | ||
22 | + | ||
19 | @Service | 23 | @Service |
20 | public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService{ | 24 | public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService{ |
21 | 25 | ||
@@ -46,4 +50,50 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i | @@ -46,4 +50,50 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i | ||
46 | } | 50 | } |
47 | return AjaxResult.success("成功删除"+count+"条记录"); | 51 | return AjaxResult.success("成功删除"+count+"条记录"); |
48 | } | 52 | } |
53 | + | ||
54 | + /** | ||
55 | + * 导入物料数据 | ||
56 | + * | ||
57 | + * @param materialList 用户数据列表 | ||
58 | + * @param operName 操作用户 | ||
59 | + * @return 结果 | ||
60 | + */ | ||
61 | + @Override | ||
62 | + public String importMaterial(List<Material> materialList, Boolean isUpdateSupport, String operName) { | ||
63 | + if (StringUtils.isNull(materialList) || materialList.size() == 0) { | ||
64 | + throw new BusinessException("导入数据不能为空!"); | ||
65 | + } | ||
66 | + int successNum = 0; | ||
67 | + int failureNum = 0; | ||
68 | + StringBuilder successMsg = new StringBuilder(); | ||
69 | + StringBuilder failureMsg = new StringBuilder(); | ||
70 | + for (Material material : materialList) { | ||
71 | + try { | ||
72 | + LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
73 | + lambdaQueryWrapper.eq(Material::getCode, material.getCode()); | ||
74 | + // 验证是否存在这个用户 | ||
75 | + Material m = this.getOne(lambdaQueryWrapper); | ||
76 | + if (StringUtils.isNull(m)) { | ||
77 | + System.out.println(ShiroUtils.getLoginName()); | ||
78 | + material.setCreatedBy(ShiroUtils.getUser().getLoginName()); | ||
79 | + material.setLastUpdatedBy(ShiroUtils.getLoginName()); | ||
80 | + this.save(material); | ||
81 | + successNum++; | ||
82 | + successMsg.append("<br/>" + successNum + "、编码 " + material.getCode() + " 导入成功"); | ||
83 | + } | ||
84 | + } catch (Exception e) { | ||
85 | + failureNum++; | ||
86 | + String msg = "<br/>" + failureNum + "、编码" + material.getCode() + " 导入失败:"; | ||
87 | + failureMsg.append(msg + e.getMessage()); | ||
88 | + log.error(msg, e); | ||
89 | + } | ||
90 | + } | ||
91 | + if (failureNum > 0) { | ||
92 | + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); | ||
93 | + throw new BusinessException(failureMsg.toString()); | ||
94 | + } else { | ||
95 | + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); | ||
96 | + } | ||
97 | + return successMsg.toString(); | ||
98 | + } | ||
49 | } | 99 | } |
src/main/java/com/huaheng/pc/receipt/receiptType/service/ReceiptTypeServiceImpl.java deleted
1 | -package com.huaheng.pc.receipt.receiptType.service; | ||
2 | - | ||
3 | -import org.springframework.stereotype.Service; | ||
4 | -import javax.annotation.Resource; | ||
5 | -import java.util.List; | ||
6 | -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
7 | -import com.huaheng.pc.receipt.receiptType.domain.ReceiptType; | ||
8 | -import com.huaheng.pc.receipt.receiptType.mapper.ReceiptTypeMapper; | ||
9 | -import com.huaheng.pc.receipt.receiptType.service.ReceiptTypeService; | ||
10 | -@Service | ||
11 | -public class ReceiptTypeServiceImpl extends ServiceImpl<ReceiptTypeMapper, ReceiptType> implements ReceiptTypeService{ | ||
12 | - | ||
13 | -} |
src/main/java/com/huaheng/pc/report/excelReport/controller/ExcelReportController.java
@@ -41,7 +41,7 @@ public class ExcelReportController extends BaseController { | @@ -41,7 +41,7 @@ public class ExcelReportController extends BaseController { | ||
41 | @GetMapping("/getreport") | 41 | @GetMapping("/getreport") |
42 | @ResponseBody | 42 | @ResponseBody |
43 | public void getReport(@RequestParam Map<String, String> params,HttpServletResponse response){ | 43 | public void getReport(@RequestParam Map<String, String> params,HttpServletResponse response){ |
44 | - excelReportService.getReport(params, response); | 44 | +// excelReportService.getReport(params, response); |
45 | } | 45 | } |
46 | 46 | ||
47 | /** | 47 | /** |
@@ -67,7 +67,8 @@ public class ExcelReportController extends BaseController { | @@ -67,7 +67,8 @@ public class ExcelReportController extends BaseController { | ||
67 | @ResponseBody | 67 | @ResponseBody |
68 | public AjaxResult addSave(Excelreport excelreport) | 68 | public AjaxResult addSave(Excelreport excelreport) |
69 | { | 69 | { |
70 | - return excelReportService.save(excelreport); | 70 | +// return excelReportService.save(excelreport); |
71 | + return AjaxResult.success(1); | ||
71 | } | 72 | } |
72 | 73 | ||
73 | @GetMapping("/edit/{id}") | 74 | @GetMapping("/edit/{id}") |
src/main/java/com/huaheng/pc/report/excelReport/service/ExcelReportService.java
@@ -21,34 +21,34 @@ public class ExcelReportService { | @@ -21,34 +21,34 @@ public class ExcelReportService { | ||
21 | @Resource | 21 | @Resource |
22 | private ExcelReportMapper mapper; | 22 | private ExcelReportMapper mapper; |
23 | 23 | ||
24 | - public void getReport(@RequestParam Map<String, String> params, HttpServletResponse response) { | ||
25 | - if(!params.containsKey("id")){ | ||
26 | -// return AjaxResult.error("未传递Id"); | ||
27 | - return; | ||
28 | - } | ||
29 | - Excelreport excelreport = mapper.selectById(Convert.toInt(params.get("id"))); | ||
30 | - if(excelreport==null){ | ||
31 | -// return AjaxResult.error("报表未配置"); | ||
32 | - return; | ||
33 | - } | ||
34 | - List<LinkedHashMap<String, Object>> list = mapper.selectCommon(excelreport.getSql()); | ||
35 | - ExcelUtil excelUtil = new ExcelUtil(); | ||
36 | - excelUtil.exportExcel2(list, excelreport.getName(),response); | ||
37 | - } | ||
38 | - | ||
39 | - public AjaxResult save(Excelreport excelreport) { | ||
40 | - String sql = excelreport.getSql().toLowerCase(); | ||
41 | - if(sql.contains("delete")||sql.contains("update")||sql.contains("drop")){ | ||
42 | - return AjaxResult.error("含有危险sql脚本"); | ||
43 | - } | ||
44 | - excelreport.setCreated(new Date()); | ||
45 | - excelreport.setCreatedBy(ShiroUtils.getLoginName()); | ||
46 | - excelreport.setWarehouseCode(ShiroUtils.getWarehouseCode()); | ||
47 | - int i = mapper.insert(excelreport); | ||
48 | - if(i>0){ | ||
49 | - return AjaxResult.success("成功"); | ||
50 | - }else { | ||
51 | - return AjaxResult.error("新增失败"); | ||
52 | - } | ||
53 | - } | 24 | +// public void getReport(@RequestParam Map<String, String> params, HttpServletResponse response) { |
25 | +// if(!params.containsKey("id")){ | ||
26 | +//// return AjaxResult.error("未传递Id"); | ||
27 | +// return; | ||
28 | +// } | ||
29 | +// Excelreport excelreport = mapper.selectById(Convert.toInt(params.get("id"))); | ||
30 | +// if(excelreport==null){ | ||
31 | +//// return AjaxResult.error("报表未配置"); | ||
32 | +// return; | ||
33 | +// } | ||
34 | +// List<LinkedHashMap<String, Object>> list = mapper.selectCommon(excelreport.getSql()); | ||
35 | +// ExcelUtil excelUtil = new ExcelUtil(); | ||
36 | +// excelUtil.exportExcel2(list, excelreport.getName(),response); | ||
37 | +// } | ||
38 | +// | ||
39 | +// public AjaxResult save(Excelreport excelreport) { | ||
40 | +// String sql = excelreport.getSql().toLowerCase(); | ||
41 | +// if(sql.contains("delete")||sql.contains("update")||sql.contains("drop")){ | ||
42 | +// return AjaxResult.error("含有危险sql脚本"); | ||
43 | +// } | ||
44 | +// excelreport.setCreated(new Date()); | ||
45 | +// excelreport.setCreatedBy(ShiroUtils.getLoginName()); | ||
46 | +// excelreport.setWarehouseCode(ShiroUtils.getWarehouseCode()); | ||
47 | +// int i = mapper.insert(excelreport); | ||
48 | +// if(i>0){ | ||
49 | +// return AjaxResult.success("成功"); | ||
50 | +// }else { | ||
51 | +// return AjaxResult.error("新增失败"); | ||
52 | +// } | ||
53 | +// } | ||
54 | } | 54 | } |
src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java
@@ -223,6 +223,7 @@ public class ShipmentDetail implements Serializable { | @@ -223,6 +223,7 @@ public class ShipmentDetail implements Serializable { | ||
223 | @ApiModelProperty(value="包装分类") | 223 | @ApiModelProperty(value="包装分类") |
224 | private String packingClass; | 224 | private String packingClass; |
225 | 225 | ||
226 | + | ||
226 | /** | 227 | /** |
227 | * 状态 | 228 | * 状态 |
228 | */ | 229 | */ |
src/main/java/com/huaheng/pc/tool/in/importController.java
0 → 100644
1 | +package com.huaheng.pc.tool.in; | ||
2 | + | ||
3 | +import org.apache.shiro.authz.annotation.RequiresPermissions; | ||
4 | +import org.springframework.stereotype.Controller; | ||
5 | +import org.springframework.web.bind.annotation.GetMapping; | ||
6 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
7 | + | ||
8 | +@Controller | ||
9 | +@RequestMapping("/tool/import") | ||
10 | +public class importController { | ||
11 | + | ||
12 | + private String prefix = "tool/import"; | ||
13 | + | ||
14 | + @RequiresPermissions("tool:import:view") | ||
15 | + @GetMapping() | ||
16 | + public String in() { | ||
17 | + return prefix + "/import"; | ||
18 | + } | ||
19 | +} |
src/main/resources/application-druid.properties
1 | -#\u6570\u636E\u6E90\u914D\u7F6E | 1 | +# 数据源配置 |
2 | spring.datasource.type=com.alibaba.druid.pool.DruidDataSource | 2 | spring.datasource.type=com.alibaba.druid.pool.DruidDataSource |
3 | spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver | 3 | spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver |
4 | -#\u4E3B\u5E93 | 4 | +# 主库 |
5 | spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | 5 | spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false |
6 | #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huahengExample?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | 6 | #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huahengExample?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false |
7 | #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huaheng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | 7 | #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huaheng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false |
@@ -11,12 +11,12 @@ spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnic | @@ -11,12 +11,12 @@ spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnic | ||
11 | 11 | ||
12 | spring.datasource.druid.master.username=softhuaheng | 12 | spring.datasource.druid.master.username=softhuaheng |
13 | spring.datasource.druid.master.password=HHrobot123. | 13 | spring.datasource.druid.master.password=HHrobot123. |
14 | -##\u4ECE\u5E93 | 14 | +# 从库 |
15 | #spring.datasource.druid.slave.open = true | 15 | #spring.datasource.druid.slave.open = true |
16 | #spring.datasource.druid.slave.url=jdbc:mysql://172.16.29.45:3306/huaheng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | 16 | #spring.datasource.druid.slave.url=jdbc:mysql://172.16.29.45:3306/huaheng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false |
17 | #spring.datasource.druid.master.username=softhuaheng | 17 | #spring.datasource.druid.master.username=softhuaheng |
18 | #spring.datasource.druid.master.password=HHrobot123. | 18 | #spring.datasource.druid.master.password=HHrobot123. |
19 | -# \u521D\u59CB\u8FDE\u63A5\u6570 | 19 | +# 初始连接数 |
20 | spring.datasource.druid.initial-size=10 | 20 | spring.datasource.druid.initial-size=10 |
21 | # \u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF | 21 | # \u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF |
22 | spring.datasource.druid.max-active=100 | 22 | spring.datasource.druid.max-active=100 |
src/main/resources/application.properties deleted
1 | -#\u9879\u76EE\u76F8\u5173\u914D\u7F6E | ||
2 | -#\u540D\u79F0 | ||
3 | -huaheng.name=huaheng | ||
4 | -#\u7248\u672C | ||
5 | -huaheng.version=4.0.0 | ||
6 | -#\u7248\u6743\u5E74\u4EFD | ||
7 | -huaheng.copyrightYear=2018 | ||
8 | -#\u5934\u50CF\u4E0A\u4F20\u8DEF\u5F84 | ||
9 | -huaheng.profile=C:/profile/ | ||
10 | -# \u83B7\u53D6ip\u5730\u5740\u5F00\u5173 | ||
11 | -huaheng.addressEnabled=false | ||
12 | - | ||
13 | -#\u5F00\u53D1\u73AF\u5883\u914D\u7F6E | ||
14 | -#\u6D4B\u8BD5\u670D\u52A1\u7AEF\u53E3\u3001\u6D4B\u8BD5\u9879\u76EEcontextPath | ||
15 | -server.port=8888 | ||
16 | -server.servlet.context-path=/twms/ | ||
17 | -#\u793A\u4F8B\u670D\u52A1\u7AEF\u53E3\u3001\u793A\u4F8B\u9879\u76EEcontextPath | ||
18 | -#server.port=8889 | ||
19 | -#server.servlet.context-path=/ewms/ | ||
20 | -#\u6B63\u5F0F\u670D\u52A1\u7AEF\u53E3\u3001\u6B63\u5F0F\u9879\u76EEcontextPath | ||
21 | -#server.port=8016 | ||
22 | -#server.servlet.context-path=/wms/ | ||
23 | -# tomcat\u7684URI\u7F16\u7801 | ||
24 | -server.tomcat.uri-encoding=UTF-8 | ||
25 | -# tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200 | ||
26 | -server.tomcat.max-threads=800 | ||
27 | -# Tomcat\u542F\u52A8\u521D\u59CB\u5316\u7684\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u503C25 | ||
28 | -server.tomcat.min-spare-threads=30 | ||
29 | - | ||
30 | -#\u65E5\u5FD7\u914D\u7F6E | ||
31 | -logging.level.com.huaheng=DEBUG | ||
32 | -logging.level.org.springframework=WARN | ||
33 | -logging.level.org.spring.springboot.dao=DEBUG | ||
34 | - | ||
35 | -#\u7528\u6237\u914D\u7F6E | ||
36 | -#\u5BC6\u7801\u9519\u8BEF5\u6B21\u9501\u5B9A10\u5206\u949F | ||
37 | -user.password.maxRetryCount=5 | ||
38 | - | ||
39 | -#Spring\u914D\u7F6E | ||
40 | -spring.thymeleaf.mode=HTML | ||
41 | -spring.thymeleaf.encoding=utf-8 | ||
42 | -# \u7981\u7528\u7F13\u5B58 | ||
43 | -spring.thymeleaf.cache=false | ||
44 | -#\u56FD\u9645\u5316\u8D44\u6E90\u6587\u4EF6\u8DEF\u5F84 | ||
45 | -spring.messages.basename=i18n/messages | ||
46 | -spring.jackson.time-zone=GMT+8 | ||
47 | -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss | ||
48 | -spring.profiles.active=druid | ||
49 | -#\u6587\u4EF6\u4E0A\u4F20 | ||
50 | -spring.servlet.multipart.max-file-size=30MB | ||
51 | -spring.servlet.multipart.max-request-size=30MB | ||
52 | -#\u70ED\u90E8\u7F72\u5F00\u5173 | ||
53 | -spring.devtools.restart.enabled=true | ||
54 | -#activiti \u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E | ||
55 | -#spring.activiti.check-process-definitions=false | ||
56 | - | ||
57 | -mybatis-plus.mapper-locations=classpath:mybatis/**/*.xml | ||
58 | -mybatis-plus.type-aliases-package=com.huaheng.pc.**.**.domain | ||
59 | - | ||
60 | -# PageHelper | ||
61 | -pagehelper.helperDialect=mysql | ||
62 | -pagehelper.reasonable=true | ||
63 | -pagehelper.supportMethodsArguments=true | ||
64 | -pagehelper.pparams=count=countSql | ||
65 | - | ||
66 | -# Shiro | ||
67 | -# \u767B\u5F55\u5730\u5740 | ||
68 | -shiro.user.loginUrl=/login | ||
69 | -# \u6743\u9650\u8BA4\u8BC1\u5931\u8D25\u5730\u5740 | ||
70 | -shiro.user.unauthorizedUrl=/unauth | ||
71 | -# \u9996\u9875\u5730\u5740 | ||
72 | -shiro.user.indexUrl=/index | ||
73 | -# \u9A8C\u8BC1\u7801\u5F00\u5173 | ||
74 | -shiro.user.captchaEnabled=false | ||
75 | -# \u9A8C\u8BC1\u7801\u7C7B\u578B math \u6570\u7EC4\u8BA1\u7B97 char \u5B57\u7B26 | ||
76 | -shiro.user.captchaType=math | ||
77 | -# \u8BBE\u7F6ECookie\u7684\u57DF\u540D \u9ED8\u8BA4\u7A7A\uFF0C\u5373\u5F53\u524D\u8BBF\u95EE\u7684\u57DF\u540D | ||
78 | -shiro.cookie.domain = | ||
79 | -# \u8BBE\u7F6Ecookie\u7684\u6709\u6548\u8BBF\u95EE\u8DEF\u5F84 | ||
80 | -shiro.cookie.path=/ | ||
81 | -# \u8BBE\u7F6EHttpOnly\u5C5E\u6027 | ||
82 | -shiro.cookie.httpOnly=true | ||
83 | -# \u8BBE\u7F6ECookie\u7684\u8FC7\u671F\u65F6\u95F4\uFF0C\u5929\u4E3A\u5355\u4F4D | ||
84 | -shiro.cookie.maxAge=30 | ||
85 | -# Session\u8D85\u65F6\u65F6\u95F4\uFF08\u9ED8\u8BA430\u5206\u949F\uFF09 | ||
86 | -shiro.session.expireTime=30 | ||
87 | -# \u540C\u6B65session\u5230\u6570\u636E\u5E93\u7684\u5468\u671F\uFF08\u9ED8\u8BA41\u5206\u949F\uFF09 | ||
88 | -shiro.session.dbSyncPeriod=1 | ||
89 | -# \u76F8\u9694\u591A\u4E45\u68C0\u67E5\u4E00\u6B21session\u7684\u6709\u6548\u6027\uFF0C\u9ED8\u8BA4\u5C31\u662F10\u5206\u949F | ||
90 | -shiro.session.validationInterval=10 | ||
91 | - | ||
92 | -# \u9632\u6B62XSS\u653B\u51FB | ||
93 | -# \u8FC7\u6EE4\u5F00\u5173 | ||
94 | -xss.enabled=true | ||
95 | -# \u6392\u9664\u94FE\u63A5\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09 | ||
96 | -xss.excludes=/system/notice/* | ||
97 | -# \u5339\u914D\u94FE\u63A5 | ||
98 | -xss.urlPatterns=/system/*,/monitor/*,/tool/* | ||
99 | - | ||
100 | -# \u4EE3\u7801\u751F\u6210 | ||
101 | -# \u4F5C\u8005 | ||
102 | -gen.author=huaheng | ||
103 | -# \u9ED8\u8BA4\u751F\u6210\u5305\u8DEF\u5F84 module \u9700\u6539\u6210\u81EA\u5DF1\u7684\u6A21\u5757\u540D\u79F0 \u5982 system monitor tool | ||
104 | -gen.packageName=com.huaheng.pc.task | ||
105 | -# \u81EA\u52A8\u53BB\u9664\u8868\u524D\u7F00\uFF0C\u9ED8\u8BA4\u662Ftrue | ||
106 | -gen.autoRemovePre=false | ||
107 | -# \u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00) | ||
108 | -gen.tablePrefix=sys_ | ||
109 | - | ||
110 | - | ||
111 | - |
src/main/resources/application.yml
0 → 100644
1 | +#\u9879\u76EE\u76F8\u5173\u914D\u7F6E | ||
2 | +#\u540D\u79F0 | ||
3 | +huaheng: | ||
4 | + name: huaheng | ||
5 | +#\u7248\u672C | ||
6 | + version: 4.0.0 | ||
7 | +#\u7248\u6743\u5E74\u4EFD | ||
8 | + copyrightYear: 2018 | ||
9 | +# \u6587\u4EF6\u8DEF\u5F84 \u793A\u4F8B\uFF08 Windows\u914D\u7F6ED:/ruoyi/uploadPath\uFF0CLinux\u914D\u7F6E /home/ruoyi/uploadPath\uFF09 | ||
10 | + profile: D:/ruoyi/uploadPath | ||
11 | +# \u83B7\u53D6ip\u5730\u5740\u5F00\u5173 | ||
12 | + addressEnabled: false | ||
13 | + | ||
14 | +#\u5F00\u53D1\u73AF\u5883\u914D\u7F6E | ||
15 | +#\u6D4B\u8BD5\u670D\u52A1\u7AEF\u53E3\u3001\u6D4B\u8BD5\u9879\u76EEcontextPath | ||
16 | +server: | ||
17 | + port: 8888 | ||
18 | + servlet: | ||
19 | + context-path: /twms/ | ||
20 | +#\u793A\u4F8B\u670D\u52A1\u7AEF\u53E3\u3001\u793A\u4F8B\u9879\u76EEcontextPath | ||
21 | +#server.port=8889 | ||
22 | +#server.servlet.context-path=/ewms/ | ||
23 | +#\u6B63\u5F0F\u670D\u52A1\u7AEF\u53E3\u3001\u6B63\u5F0F\u9879\u76EEcontextPath | ||
24 | +#server.port=8016 | ||
25 | +#server.servlet.context-path=/wms/ | ||
26 | +# tomcat\u7684URI\u7F16\u7801 | ||
27 | + tomcat: | ||
28 | + uri-encoding: UTF-8 | ||
29 | +# tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200 | ||
30 | + max-threads: 800 | ||
31 | +# Tomcat\u542F\u52A8\u521D\u59CB\u5316\u7684\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u503C25 | ||
32 | + min-spare-threads: 30 | ||
33 | + | ||
34 | +#\u65E5\u5FD7\u914D\u7F6E | ||
35 | +logging: | ||
36 | + level: | ||
37 | + com.huaheng: debug | ||
38 | + org.springframework: warn | ||
39 | + spring.springboot.dao: DEBUG | ||
40 | + | ||
41 | +# \u7528\u6237\u914D\u7F6E | ||
42 | +user: | ||
43 | + password: | ||
44 | + # \u5BC6\u7801\u9519\u8BEF{maxRetryCount}\u6B21\u9501\u5B9A10\u5206\u949F | ||
45 | + maxRetryCount: 5 | ||
46 | + | ||
47 | +# Spring\u914D\u7F6E | ||
48 | +spring: | ||
49 | + # \u6A21\u677F\u5F15\u64CE | ||
50 | + thymeleaf: | ||
51 | + mode: HTML | ||
52 | + encoding: utf-8 | ||
53 | + # \u7981\u7528\u7F13\u5B58 | ||
54 | + cache: false | ||
55 | +#\u56FD\u9645\u5316\u8D44\u6E90\u6587\u4EF6\u8DEF\u5F84 | ||
56 | + messages: | ||
57 | + basename: i18n/messages | ||
58 | + jackson: | ||
59 | + time-zone: GMT+8 | ||
60 | + date-format: yyyy-MM-dd HH:mm:ss | ||
61 | + profiles: | ||
62 | + active: druid | ||
63 | + # \u6587\u4EF6\u4E0A\u4F20 | ||
64 | + servlet: | ||
65 | + multipart: | ||
66 | + # \u5355\u4E2A\u6587\u4EF6\u5927\u5C0F | ||
67 | + max-file-size: 30MB | ||
68 | + # \u8BBE\u7F6E\u603B\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F | ||
69 | + max-request-size: 30MB | ||
70 | + # \u670D\u52A1\u6A21\u5757 | ||
71 | + devtools: | ||
72 | + restart: | ||
73 | + # \u70ED\u90E8\u7F72\u5F00\u5173 | ||
74 | + enabled: true | ||
75 | + | ||
76 | +mybatis-plus: | ||
77 | + mapper-locations: classpath:mybatis/**/*.xml | ||
78 | + type-aliases-package: com.huaheng.pc.**.**.domain | ||
79 | + | ||
80 | +# PageHelper\u5206\u9875\u63D2\u4EF6 | ||
81 | +pagehelper: | ||
82 | + helperDialect: mysql | ||
83 | + reasonable: true | ||
84 | + supportMethodsArguments: true | ||
85 | + params: count=countSql | ||
86 | + | ||
87 | +# Shiro | ||
88 | +shiro: | ||
89 | + user: | ||
90 | + # \u767B\u5F55\u5730\u5740 | ||
91 | + loginUrl: /login | ||
92 | + # \u6743\u9650\u8BA4\u8BC1\u5931\u8D25\u5730\u5740 | ||
93 | + unauthorizedUrl: /unauth | ||
94 | + # \u9996\u9875\u5730\u5740 | ||
95 | + indexUrl: /index | ||
96 | + # \u9A8C\u8BC1\u7801\u5F00\u5173 | ||
97 | + captchaEnabled: false | ||
98 | + # \u9A8C\u8BC1\u7801\u7C7B\u578B math \u6570\u7EC4\u8BA1\u7B97 char \u5B57\u7B26 | ||
99 | + captchaType: math | ||
100 | + cookie: | ||
101 | + # \u8BBE\u7F6ECookie\u7684\u57DF\u540D \u9ED8\u8BA4\u7A7A\uFF0C\u5373\u5F53\u524D\u8BBF\u95EE\u7684\u57DF\u540D | ||
102 | + domain: | ||
103 | + # \u8BBE\u7F6Ecookie\u7684\u6709\u6548\u8BBF\u95EE\u8DEF\u5F84 | ||
104 | + path: / | ||
105 | + # \u8BBE\u7F6EHttpOnly\u5C5E\u6027 | ||
106 | + httpOnly: true | ||
107 | + # \u8BBE\u7F6ECookie\u7684\u8FC7\u671F\u65F6\u95F4\uFF0C\u5929\u4E3A\u5355\u4F4D | ||
108 | + maxAge: 30 | ||
109 | + session: | ||
110 | + # Session\u8D85\u65F6\u65F6\u95F4\uFF08\u9ED8\u8BA430\u5206\u949F\uFF09 | ||
111 | + expireTime: 30 | ||
112 | + # \u540C\u6B65session\u5230\u6570\u636E\u5E93\u7684\u5468\u671F\uFF08\u9ED8\u8BA41\u5206\u949F\uFF09 | ||
113 | + dbSyncPeriod: 1 | ||
114 | + # \u76F8\u9694\u591A\u4E45\u68C0\u67E5\u4E00\u6B21session\u7684\u6709\u6548\u6027\uFF0C\u9ED8\u8BA4\u5C31\u662F10\u5206\u949F | ||
115 | + validationInterval: 10 | ||
116 | + | ||
117 | +# \u9632\u6B62XSS\u653B\u51FB | ||
118 | +xss: | ||
119 | + # \u8FC7\u6EE4\u5F00\u5173 | ||
120 | + enabled: true | ||
121 | + # \u6392\u9664\u94FE\u63A5\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09 | ||
122 | + excludes: /system/notice/* | ||
123 | + # \u5339\u914D\u94FE\u63A5 | ||
124 | + urlPatterns: /system/*,/monitor/*,/tool/* | ||
125 | + | ||
126 | +# \u4EE3\u7801\u751F\u6210 | ||
127 | +# \u4F5C\u8005 | ||
128 | +gen: | ||
129 | + author: huaheng | ||
130 | +# \u9ED8\u8BA4\u751F\u6210\u5305\u8DEF\u5F84 module \u9700\u6539\u6210\u81EA\u5DF1\u7684\u6A21\u5757\u540D\u79F0 \u5982 system monitor tool | ||
131 | + packageName: com.huaheng.pc.task | ||
132 | +# \u81EA\u52A8\u53BB\u9664\u8868\u524D\u7F00\uFF0C\u9ED8\u8BA4\u662Ftrue | ||
133 | + autoRemovePre: false | ||
134 | +# \u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00) | ||
135 | + gen.tablePrefix: sys_ | ||
136 | + | ||
137 | + | ||
138 | + |
src/main/resources/mybatis/receipt/ReceiptTypeMapper.xml renamed to src/main/resources/mybatis/config/ReceiptTypeMapper.xml
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | 2 | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
3 | -<mapper namespace="com.huaheng.pc.receipt.receiptType.mapper.ReceiptTypeMapper"> | ||
4 | - <resultMap id="BaseResultMap" type="com.huaheng.pc.receipt.receiptType.domain.ReceiptType"> | 3 | +<mapper namespace="com.huaheng.pc.config.receiptType.mapper.ReceiptTypeMapper"> |
4 | + <resultMap id="BaseResultMap" type="com.huaheng.pc.config.receiptType.domain.ReceiptType"> | ||
5 | <!--@mbg.generated--> | 5 | <!--@mbg.generated--> |
6 | <id column="id" jdbcType="INTEGER" property="id" /> | 6 | <id column="id" jdbcType="INTEGER" property="id" /> |
7 | <result column="warehouseCode" jdbcType="VARCHAR" property="warehouseCode" /> | 7 | <result column="warehouseCode" jdbcType="VARCHAR" property="warehouseCode" /> |
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | <result column="code" jdbcType="VARCHAR" property="code" /> | 9 | <result column="code" jdbcType="VARCHAR" property="code" /> |
10 | <result column="referType" jdbcType="VARCHAR" property="referType" /> | 10 | <result column="referType" jdbcType="VARCHAR" property="referType" /> |
11 | <result column="receiptFlow" jdbcType="VARCHAR" property="receiptFlow" /> | 11 | <result column="receiptFlow" jdbcType="VARCHAR" property="receiptFlow" /> |
12 | - <result column="enable" jdbcType="VARCHAR" property="enable" /> | 12 | + <result column="enable" jdbcType="BIT" property="enable" /> |
13 | <result column="created" jdbcType="TIMESTAMP" property="created" /> | 13 | <result column="created" jdbcType="TIMESTAMP" property="created" /> |
14 | <result column="createdBy" jdbcType="VARCHAR" property="createdBy" /> | 14 | <result column="createdBy" jdbcType="VARCHAR" property="createdBy" /> |
15 | <result column="lastUpdated" jdbcType="TIMESTAMP" property="lastUpdated" /> | 15 | <result column="lastUpdated" jdbcType="TIMESTAMP" property="lastUpdated" /> |
src/main/resources/mybatis/general/BomDetailMapper.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
3 | +<mapper namespace="com.huaheng.pc.general.bom.mapper.BomDetailMapper"> | ||
4 | + <resultMap id="BaseResultMap" type="com.huaheng.pc.general.bom.domain.BomDetail"> | ||
5 | + <!--@mbg.generated--> | ||
6 | + <id column="id" jdbcType="INTEGER" property="id" /> | ||
7 | + <result column="warehouseCode" jdbcType="VARCHAR" property="warehouseCode" /> | ||
8 | + <result column="companyCode" jdbcType="VARCHAR" property="companyCode" /> | ||
9 | + <result column="bomId" jdbcType="INTEGER" property="bomId" /> | ||
10 | + <result column="materialCode" jdbcType="VARCHAR" property="materialCode" /> | ||
11 | + <result column="materialName" jdbcType="VARCHAR" property="materialName" /> | ||
12 | + <result column="materialUnit" jdbcType="VARCHAR" property="materialUnit" /> | ||
13 | + <result column="buildLevel" jdbcType="INTEGER" property="buildLevel" /> | ||
14 | + <result column="buildSequence" jdbcType="INTEGER" property="buildSequence" /> | ||
15 | + <result column="qty" jdbcType="INTEGER" property="qty" /> | ||
16 | + <result column="allocationRule" jdbcType="VARCHAR" property="allocationRule" /> | ||
17 | + <result column="fromLocation" jdbcType="VARCHAR" property="fromLocation" /> | ||
18 | + <result column="enable" jdbcType="BIT" property="enable" /> | ||
19 | + <result column="created" jdbcType="TIMESTAMP" property="created" /> | ||
20 | + <result column="createdBy" jdbcType="VARCHAR" property="createdBy" /> | ||
21 | + <result column="lastUpdated" jdbcType="TIMESTAMP" property="lastUpdated" /> | ||
22 | + <result column="lastUpdatedBy" jdbcType="VARCHAR" property="lastUpdatedBy" /> | ||
23 | + <result column="version" jdbcType="INTEGER" property="version" /> | ||
24 | + <result column="userDef1" jdbcType="VARCHAR" property="userDef1" /> | ||
25 | + <result column="userDef2" jdbcType="VARCHAR" property="userDef2" /> | ||
26 | + <result column="userDef3" jdbcType="VARCHAR" property="userDef3" /> | ||
27 | + <result column="userDef4" jdbcType="VARCHAR" property="userDef4" /> | ||
28 | + <result column="userDef5" jdbcType="VARCHAR" property="userDef5" /> | ||
29 | + <result column="userDef6" jdbcType="VARCHAR" property="userDef6" /> | ||
30 | + <result column="userDef7" jdbcType="VARCHAR" property="userDef7" /> | ||
31 | + <result column="userDef8" jdbcType="VARCHAR" property="userDef8" /> | ||
32 | + <result column="processStamp" jdbcType="VARCHAR" property="processStamp" /> | ||
33 | + </resultMap> | ||
34 | + <sql id="Base_Column_List"> | ||
35 | + <!--@mbg.generated--> | ||
36 | + id, warehouseCode, companyCode, bomId, materialCode, materialName, materialUnit, | ||
37 | + buildLevel, buildSequence, qty, allocationRule, fromLocation, `enable`, created, | ||
38 | + createdBy, lastUpdated, lastUpdatedBy, version, userDef1, userDef2, userDef3, userDef4, | ||
39 | + userDef5, userDef6, userDef7, userDef8, processStamp | ||
40 | + </sql> | ||
41 | +</mapper> | ||
0 | \ No newline at end of file | 42 | \ No newline at end of file |
src/main/resources/static/ajax/libs/layui/lay/modules/upload.js
0 → 100644
1 | +/** layui-v2.4.5 MIT License By https://www.layui.com */ | ||
2 | + ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['<input class="'+u+'" type="file" accept="'+t.acceptMime+'" name="'+t.field+'"',t.multiple?" multiple":"",">"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),a=i(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+t.url+'">',"</form>"].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('<input type="hidden" name="'+i+'" value="'+t+'">')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after('<span class="layui-inline '+s+'">'+o+"</span>")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); | ||
0 | \ No newline at end of file | 3 | \ No newline at end of file |
src/main/resources/static/file/物料.xls
0 → 100644
1 | +ÎïÁÏ code |
src/main/resources/static/huaheng/js/huahengUI.js
@@ -159,7 +159,59 @@ | @@ -159,7 +159,59 @@ | ||
159 | } | 159 | } |
160 | }); | 160 | }); |
161 | return actions.join(''); | 161 | return actions.join(''); |
162 | - } | 162 | + }, |
163 | + // 导入数据 | ||
164 | + importExcel: function(formId) { | ||
165 | + var currentId = $.common.isEmpty(formId) ? 'importTpl' : formId; | ||
166 | + layer.open({ | ||
167 | + type: 1, | ||
168 | + area: ['400px', '230px'], | ||
169 | + fix: false, | ||
170 | + //不固定 | ||
171 | + maxmin: true, | ||
172 | + shade: 0.3, | ||
173 | + title: '导入' + $.table._option.modalName + '数据', | ||
174 | + content: $('#' + currentId).html(), | ||
175 | + btn: ['<i class="fa fa-check"></i> 导入', '<i class="fa fa-remove"></i> 取消'], | ||
176 | + // 弹层外区域关闭 | ||
177 | + shadeClose: true, | ||
178 | + btn1: function(index, layero){ | ||
179 | + var file = layero.find('#file').val(); | ||
180 | + if (file == '' || (!$.common.endWith(file, '.xls') && !$.common.endWith(file, '.xlsx'))){ | ||
181 | + $.modal.msgWarning("请选择后缀为 “xls”或“xlsx”的文件。"); | ||
182 | + return false; | ||
183 | + } | ||
184 | + var index = layer.load(2, {shade: false}); | ||
185 | + $.modal.disable(); | ||
186 | + var formData = new FormData(); | ||
187 | + formData.append("file", $('#file')[0].files[0]); | ||
188 | + formData.append("updateSupport", $("input[name='updateSupport']").is(':checked')); | ||
189 | + $.ajax({ | ||
190 | + url: $.table._option.importUrl, | ||
191 | + data: formData, | ||
192 | + cache: false, | ||
193 | + contentType: false, | ||
194 | + processData: false, | ||
195 | + type: 'POST', | ||
196 | + success: function (result) { | ||
197 | + if (result.code == web_status.SUCCESS) { | ||
198 | + $.modal.closeAll(); | ||
199 | + $.modal.alertSuccess(result.msg); | ||
200 | + $.table.refresh(); | ||
201 | + } else if (result.code == web_status.WARNING) { | ||
202 | + layer.close(index); | ||
203 | + $.modal.enable(); | ||
204 | + $.modal.alertWarning(result.msg) | ||
205 | + } else { | ||
206 | + layer.close(index); | ||
207 | + $.modal.enable(); | ||
208 | + $.modal.alertError(result.msg); | ||
209 | + } | ||
210 | + } | ||
211 | + }); | ||
212 | + } | ||
213 | + }); | ||
214 | + }, | ||
163 | }, | 215 | }, |
164 | // 表格树封装处理 | 216 | // 表格树封装处理 |
165 | treeTable: { | 217 | treeTable: { |
src/main/resources/templates/config/receiptType/add.html
0 → 100644
1 | +<!DOCTYPE HTML> | ||
2 | +<html lang="zh" xmlns:th="http://www.thymeleaf.org"> | ||
3 | +<meta charset="utf-8"> | ||
4 | +<head th:include="include :: header"></head> | ||
5 | +<body class="white-bg"> | ||
6 | +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> | ||
7 | + <form class="form-horizontal m" id="form-receiptType-add"> | ||
8 | + <div class="form-group"> | ||
9 | + <label class="col-sm-3 control-label">编码:</label> | ||
10 | + <div class="col-sm-8"> | ||
11 | + <input id="code" name="code" class="form-control" type="text"> | ||
12 | + </div> | ||
13 | + </div> | ||
14 | + <div class="form-group"> | ||
15 | + <label class="col-sm-3 control-label">货主编码:</label> | ||
16 | + <div class="col-sm-8"> | ||
17 | + <select id="companyCode" name="companyCode" class="form-control" th:with="companyList=${@companyService.selectCompanyByCurrentUserId()}"> | ||
18 | + <option th:each="company : ${companyList}" th:text="${company['name']}" th:value="${company['code']}"></option> | ||
19 | + </select> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + <!--<div class="form-group"> --> | ||
23 | + <!--<label class="col-sm-3 control-label">仓库Id:</label>--> | ||
24 | + <!--<div class="col-sm-8">--> | ||
25 | + <!--<input id="warehouseId" name="warehouseId" class="form-control" type="text">--> | ||
26 | + <!--</div>--> | ||
27 | + <!--</div>--> | ||
28 | + <!--<div class="form-group"> --> | ||
29 | + <!--<label class="col-sm-3 control-label">仓库编码:</label>--> | ||
30 | + <!--<div class="col-sm-8">--> | ||
31 | + <!--<input id="warehouseCode" name="warehouseCode" class="form-control" type="text">--> | ||
32 | + <!--</div>--> | ||
33 | + <!--</div>--> | ||
34 | + <div class="form-group"> | ||
35 | + <label class="col-sm-3 control-label">关联订单类型:</label> | ||
36 | + <div class="col-sm-8"> | ||
37 | + <input id="referType" name="referType" class="form-control" type="text"> | ||
38 | + </div> | ||
39 | + </div> | ||
40 | + <div class="form-group"> | ||
41 | + <label class="col-sm-3 control-label">入库流程:</label> | ||
42 | + <div class="col-sm-8"> | ||
43 | + <input id="receiptFlow" name="receiptFlow" class="form-control" type="text"> | ||
44 | + </div> | ||
45 | + </div> | ||
46 | + <!--<div class="form-group"> | ||
47 | + <label class="col-sm-3 control-label">数据版本:</label> | ||
48 | + <div class="col-sm-8"> | ||
49 | + <input id="version" name="version" class="form-control" type="text"> | ||
50 | + </div> | ||
51 | + </div>--> | ||
52 | + <!--<div class="form-group"> --> | ||
53 | + <!--<label class="col-sm-3 control-label">创建时间:</label>--> | ||
54 | + <!--<div class="col-sm-8">--> | ||
55 | + <!--<input id="created" name="created" class="form-control" type="text">--> | ||
56 | + <!--</div>--> | ||
57 | + <!--</div>--> | ||
58 | + <!--<div class="form-group"> --> | ||
59 | + <!--<label class="col-sm-3 control-label">创建者:</label>--> | ||
60 | + <!--<div class="col-sm-8">--> | ||
61 | + <!--<input id="createdBy" name="createdBy" class="form-control" type="text">--> | ||
62 | + <!--</div>--> | ||
63 | + <!--</div>--> | ||
64 | + <!--<div class="form-group"> --> | ||
65 | + <!--<label class="col-sm-3 control-label">创建时间:</label>--> | ||
66 | + <!--<div class="col-sm-8">--> | ||
67 | + <!--<input id="lastUpdated" name="lastUpdated" class="form-control" type="text">--> | ||
68 | + <!--</div>--> | ||
69 | + <!--</div>--> | ||
70 | + <!--<div class="form-group"> --> | ||
71 | + <!--<label class="col-sm-3 control-label">更新者:</label>--> | ||
72 | + <!--<div class="col-sm-8">--> | ||
73 | + <!--<input id="lastUpdatedBy" name="lastUpdatedBy" class="form-control" type="text">--> | ||
74 | + <!--</div>--> | ||
75 | + <!--</div>--> | ||
76 | + <!--<div class="form-group"> --> | ||
77 | + <!--<label class="col-sm-3 control-label">是否有效:</label>--> | ||
78 | + <!--<div class="col-sm-8">--> | ||
79 | + <!--<!–<input id="enable" name="enable" class="form-control" type="text">–>--> | ||
80 | + <!--<div class="onoffswitch">--> | ||
81 | + <!--<input type="checkbox" th:checked="true" class="onoffswitch-checkbox" id="enable" name="enable">--> | ||
82 | + <!--<label class="onoffswitch-label" for="enable">--> | ||
83 | + <!--<span class="onoffswitch-inner"></span>--> | ||
84 | + <!--<span class="onoffswitch-switch"></span>--> | ||
85 | + <!--</label>--> | ||
86 | + <!--</div>--> | ||
87 | + <!--</div>--> | ||
88 | + <!--</div>--> | ||
89 | + <!--<div class="form-group"> --> | ||
90 | + <!--<label class="col-sm-3 control-label">是否删除:</label>--> | ||
91 | + <!--<div class="col-sm-8">--> | ||
92 | + <!--<input id="deleted" name="deleted" class="form-control" type="text">--> | ||
93 | + <!--</div>--> | ||
94 | + <!--</div>--> | ||
95 | + <!--<div class="form-group"> --> | ||
96 | + <!--<label class="col-sm-3 control-label">自定义字段1:</label>--> | ||
97 | + <!--<div class="col-sm-8">--> | ||
98 | + <!--<input id="userDef1" name="userDef1" class="form-control" type="text">--> | ||
99 | + <!--</div>--> | ||
100 | + <!--</div>--> | ||
101 | + <!--<div class="form-group"> --> | ||
102 | + <!--<label class="col-sm-3 control-label">自定义字段2:</label>--> | ||
103 | + <!--<div class="col-sm-8">--> | ||
104 | + <!--<input id="userDef2" name="userDef2" class="form-control" type="text">--> | ||
105 | + <!--</div>--> | ||
106 | + <!--</div>--> | ||
107 | + <!--<div class="form-group"> --> | ||
108 | + <!--<label class="col-sm-3 control-label">自定义字段3:</label>--> | ||
109 | + <!--<div class="col-sm-8">--> | ||
110 | + <!--<input id="userDef3" name="userDef3" class="form-control" type="text">--> | ||
111 | + <!--</div>--> | ||
112 | + <!--</div>--> | ||
113 | + <!--<div class="form-group"> --> | ||
114 | + <!--<label class="col-sm-3 control-label">自定义字段4:</label>--> | ||
115 | + <!--<div class="col-sm-8">--> | ||
116 | + <!--<input id="userDef4" name="userDef4" class="form-control" type="text">--> | ||
117 | + <!--</div>--> | ||
118 | + <!--</div>--> | ||
119 | + <!--<div class="form-group"> --> | ||
120 | + <!--<label class="col-sm-3 control-label">自定义字段5:</label>--> | ||
121 | + <!--<div class="col-sm-8">--> | ||
122 | + <!--<input id="userDef5" name="userDef5" class="form-control" type="text">--> | ||
123 | + <!--</div>--> | ||
124 | + <!--</div>--> | ||
125 | + <div class="form-group"> | ||
126 | + <label class="col-sm-3 control-label">是否启用:</label> | ||
127 | + <div class="col-sm-8"> | ||
128 | + <div class="onoffswitch"> | ||
129 | + <input type="checkbox" th:checked="true" class="onoffswitch-checkbox" id="enable" name="enable"> | ||
130 | + <label class="onoffswitch-label" for="enable"> | ||
131 | + <span class="onoffswitch-inner"></span> | ||
132 | + <span class="onoffswitch-switch"></span> | ||
133 | + </label> | ||
134 | + </div> | ||
135 | + </div> | ||
136 | + </div> | ||
137 | + <div class="form-group"> | ||
138 | + <div class="form-control-static col-sm-offset-9"> | ||
139 | + <button type="submit" class="btn btn-primary">提交</button> | ||
140 | + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> | ||
141 | + </div> | ||
142 | + </div> | ||
143 | + </form> | ||
144 | +</div> | ||
145 | +<div th:include="include::footer"></div> | ||
146 | +<script type="text/javascript"> | ||
147 | + var prefix = ctx + "config/receiptType"; | ||
148 | + $("#form-receiptType-add").validate({ | ||
149 | + rules:{ | ||
150 | + code:{ | ||
151 | + required:true, | ||
152 | + }, | ||
153 | + referType:{ | ||
154 | + required:true, | ||
155 | + }, | ||
156 | + receiptFlow:{ | ||
157 | + required:true, | ||
158 | + }, | ||
159 | + }, | ||
160 | + submitHandler: function(form) { | ||
161 | + // $.operate.save(prefix + "/add", $('#form-locationType-add').serialize()); | ||
162 | + var tableValue = $.common.getTableValue("#form-receiptType-add"); | ||
163 | + tableValue = formValueReplace(tableValue, "companyCode", $("#companyCode option:selected").val()); | ||
164 | + tableValue = formValueReplace(tableValue, "enable", $("input[name='enable']").is(':checked')); | ||
165 | + $.operate.save(prefix + "/add", tableValue); | ||
166 | + } | ||
167 | + }); | ||
168 | +</script> | ||
169 | +</body> | ||
170 | +</html> |
src/main/resources/templates/config/receiptType/edit.html
0 → 100644
1 | +<!DOCTYPE HTML> | ||
2 | +<html lang="zh" xmlns:th="http://www.thymeleaf.org"> | ||
3 | +<meta charset="utf-8"> | ||
4 | +<head th:include="include :: header"></head> | ||
5 | +<body class="white-bg"> | ||
6 | +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> | ||
7 | + <form class="form-horizontal m" id="form-receiptType-edit" th:object="${receiptType}"> | ||
8 | + <input name="id" type="hidden" th:field="*{id}"> | ||
9 | + <div class="form-group"> | ||
10 | + <label class="col-sm-3 control-label">编码:</label> | ||
11 | + <div class="col-sm-8"> | ||
12 | + <input id="code" name="code" class="form-control" type="text" th:field="*{code}"> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="form-group"> | ||
16 | + <label class="col-sm-3 control-label">货主编码:</label> | ||
17 | + <div class="col-sm-8"> | ||
18 | + <select id="companyCode" name="companyCode" class="form-control" th:with="companyList=${@companyService.selectCompanyByCurrentUserId()}" | ||
19 | + th:field="*{companyCode}"> | ||
20 | + <option th:each="company : ${companyList}" th:text="${company['name']}" th:value="${company['code']}"></option> | ||
21 | + </select> | ||
22 | + </div> | ||
23 | + </div> | ||
24 | + <!--<div class="form-group"> --> | ||
25 | + <!--<label class="col-sm-3 control-label">仓库Id:</label>--> | ||
26 | + <!--<div class="col-sm-8">--> | ||
27 | + <!--<input id="warehouseId" name="warehouseId" class="form-control" type="text">--> | ||
28 | + <!--</div>--> | ||
29 | + <!--</div>--> | ||
30 | + <!--<div class="form-group"> --> | ||
31 | + <!--<label class="col-sm-3 control-label">仓库编码:</label>--> | ||
32 | + <!--<div class="col-sm-8">--> | ||
33 | + <!--<input id="warehouseCode" name="warehouseCode" class="form-control" type="text">--> | ||
34 | + <!--</div>--> | ||
35 | + <!--</div>--> | ||
36 | + <div class="form-group"> | ||
37 | + <label class="col-sm-3 control-label">关联订单类型:</label> | ||
38 | + <div class="col-sm-8"> | ||
39 | + <input id="referType" name="referType" class="form-control" type="text" th:field="*{referType}"> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="form-group"> | ||
43 | + <label class="col-sm-3 control-label">入库流程:</label> | ||
44 | + <div class="col-sm-8"> | ||
45 | + <input id="receiptFlow" name="receiptFlow" class="form-control" type="text" th:field="*{receiptFlow}"> | ||
46 | + </div> | ||
47 | + </div> | ||
48 | + <!--<div class="form-group"> | ||
49 | + <label class="col-sm-3 control-label">数据版本:</label> | ||
50 | + <div class="col-sm-8"> | ||
51 | + <input id="version" name="version" class="form-control" type="text"> | ||
52 | + </div> | ||
53 | + </div>--> | ||
54 | + <!--<div class="form-group"> --> | ||
55 | + <!--<label class="col-sm-3 control-label">创建时间:</label>--> | ||
56 | + <!--<div class="col-sm-8">--> | ||
57 | + <!--<input id="created" name="created" class="form-control" type="text">--> | ||
58 | + <!--</div>--> | ||
59 | + <!--</div>--> | ||
60 | + <!--<div class="form-group"> --> | ||
61 | + <!--<label class="col-sm-3 control-label">创建者:</label>--> | ||
62 | + <!--<div class="col-sm-8">--> | ||
63 | + <!--<input id="createdBy" name="createdBy" class="form-control" type="text">--> | ||
64 | + <!--</div>--> | ||
65 | + <!--</div>--> | ||
66 | + <!--<div class="form-group"> --> | ||
67 | + <!--<label class="col-sm-3 control-label">创建时间:</label>--> | ||
68 | + <!--<div class="col-sm-8">--> | ||
69 | + <!--<input id="lastUpdated" name="lastUpdated" class="form-control" type="text">--> | ||
70 | + <!--</div>--> | ||
71 | + <!--</div>--> | ||
72 | + <!--<div class="form-group"> --> | ||
73 | + <!--<label class="col-sm-3 control-label">更新者:</label>--> | ||
74 | + <!--<div class="col-sm-8">--> | ||
75 | + <!--<input id="lastUpdatedBy" name="lastUpdatedBy" class="form-control" type="text">--> | ||
76 | + <!--</div>--> | ||
77 | + <!--</div>--> | ||
78 | + <!--<div class="form-group"> --> | ||
79 | + <!--<label class="col-sm-3 control-label">是否有效:</label>--> | ||
80 | + <!--<div class="col-sm-8">--> | ||
81 | + <!--<!–<input id="enable" name="enable" class="form-control" type="text">–>--> | ||
82 | + <!--<div class="onoffswitch">--> | ||
83 | + <!--<input type="checkbox" th:checked="true" class="onoffswitch-checkbox" id="enable" name="enable">--> | ||
84 | + <!--<label class="onoffswitch-label" for="enable">--> | ||
85 | + <!--<span class="onoffswitch-inner"></span>--> | ||
86 | + <!--<span class="onoffswitch-switch"></span>--> | ||
87 | + <!--</label>--> | ||
88 | + <!--</div>--> | ||
89 | + <!--</div>--> | ||
90 | + <!--</div>--> | ||
91 | + <!--<div class="form-group"> --> | ||
92 | + <!--<label class="col-sm-3 control-label">是否删除:</label>--> | ||
93 | + <!--<div class="col-sm-8">--> | ||
94 | + <!--<input id="deleted" name="deleted" class="form-control" type="text">--> | ||
95 | + <!--</div>--> | ||
96 | + <!--</div>--> | ||
97 | + <!--<div class="form-group"> --> | ||
98 | + <!--<label class="col-sm-3 control-label">自定义字段1:</label>--> | ||
99 | + <!--<div class="col-sm-8">--> | ||
100 | + <!--<input id="userDef1" name="userDef1" class="form-control" type="text">--> | ||
101 | + <!--</div>--> | ||
102 | + <!--</div>--> | ||
103 | + <!--<div class="form-group"> --> | ||
104 | + <!--<label class="col-sm-3 control-label">自定义字段2:</label>--> | ||
105 | + <!--<div class="col-sm-8">--> | ||
106 | + <!--<input id="userDef2" name="userDef2" class="form-control" type="text">--> | ||
107 | + <!--</div>--> | ||
108 | + <!--</div>--> | ||
109 | + <!--<div class="form-group"> --> | ||
110 | + <!--<label class="col-sm-3 control-label">自定义字段3:</label>--> | ||
111 | + <!--<div class="col-sm-8">--> | ||
112 | + <!--<input id="userDef3" name="userDef3" class="form-control" type="text">--> | ||
113 | + <!--</div>--> | ||
114 | + <!--</div>--> | ||
115 | + <!--<div class="form-group"> --> | ||
116 | + <!--<label class="col-sm-3 control-label">自定义字段4:</label>--> | ||
117 | + <!--<div class="col-sm-8">--> | ||
118 | + <!--<input id="userDef4" name="userDef4" class="form-control" type="text">--> | ||
119 | + <!--</div>--> | ||
120 | + <!--</div>--> | ||
121 | + <!--<div class="form-group"> --> | ||
122 | + <!--<label class="col-sm-3 control-label">自定义字段5:</label>--> | ||
123 | + <!--<div class="col-sm-8">--> | ||
124 | + <!--<input id="userDef5" name="userDef5" class="form-control" type="text">--> | ||
125 | + <!--</div>--> | ||
126 | + <!--</div>--> | ||
127 | + <div class="form-group"> | ||
128 | + <label class="col-sm-3 control-label">是否启用:</label> | ||
129 | + <div class="col-sm-8"> | ||
130 | + <div class="onoffswitch"> | ||
131 | + <input type="checkbox" th:checked="true" class="onoffswitch-checkbox" id="enable" name="enable" th:field="${enable}"> | ||
132 | + <label class="onoffswitch-label" for="enable"> | ||
133 | + <span class="onoffswitch-inner"></span> | ||
134 | + <span class="onoffswitch-switch"></span> | ||
135 | + </label> | ||
136 | + </div> | ||
137 | + </div> | ||
138 | + </div> | ||
139 | + <div class="form-group"> | ||
140 | + <div class="form-control-static col-sm-offset-9"> | ||
141 | + <button type="submit" class="btn btn-primary">提交</button> | ||
142 | + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> | ||
143 | + </div> | ||
144 | + </div> | ||
145 | + </form> | ||
146 | +</div> | ||
147 | +<div th:include="include::footer"></div> | ||
148 | +<script type="text/javascript"> | ||
149 | + var prefix = ctx + "config/receiptType"; | ||
150 | + $("#form-locationType-add").validate({ | ||
151 | + rules:{ | ||
152 | + code:{ | ||
153 | + required:true, | ||
154 | + }, | ||
155 | + referType:{ | ||
156 | + required:true, | ||
157 | + }, | ||
158 | + receiptFlow:{ | ||
159 | + required:true, | ||
160 | + }, | ||
161 | + }, | ||
162 | + submitHandler: function(form) { | ||
163 | + // $.operate.save(prefix + "/add", $('#form-locationType-add').serialize()); | ||
164 | + var tableValue = $.common.getTableValue("#form-locationType-add"); | ||
165 | + tableValue = formValueReplace(tableValue, "companyCode", $("#companyCode option:selected").val()); | ||
166 | + $.operate.save(prefix + "/add", tableValue); | ||
167 | + } | ||
168 | + }); | ||
169 | +</script> | ||
170 | +</body> | ||
171 | +</html> |
src/main/resources/templates/config/receiptType/receiptType.html
0 → 100644
1 | +<!DOCTYPE HTML> | ||
2 | +<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> | ||
3 | +<meta charset="utf-8"> | ||
4 | +<head th:include="include :: header"></head> | ||
5 | +<body class="gray-bg"> | ||
6 | +<div class="container-div"> | ||
7 | + <div class="row"> | ||
8 | + <div class="col-sm-12 select-info"> | ||
9 | + <form id="locationType-form"> | ||
10 | + <div class="select-list"> | ||
11 | + <ul> | ||
12 | + <li> | ||
13 | + 编码:<input type="text" name="code"/> | ||
14 | + </li> | ||
15 | + <li class="time"> | ||
16 | + <label>创建时间: </label> | ||
17 | + <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="createdBegin"/> | ||
18 | + <span>-</span> | ||
19 | + <input type="text" class="time-input" id="endTime" placeholder="结束时间" name="createdEnd"/> | ||
20 | + </li> | ||
21 | + <li> | ||
22 | + <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a> | ||
23 | + <!--<a class="btn btn-success btn-rounded btn-sm" onclick="$.table.exportExcel()" shiro:hasPermission="system:role:export"><i class="fa fa-download"></i> 导出</a>--> | ||
24 | + </li> | ||
25 | + </ul> | ||
26 | + </div> | ||
27 | + </form> | ||
28 | + </div> | ||
29 | + <div class="btn-group hidden-xs" id="toolbar" role="group"> | ||
30 | + <a class="btn btn-outline btn-success btn-rounded" onclick="$.operate.add()" shiro:hasPermission="config:locationType:add"> | ||
31 | + <i class="fa fa-plus"></i> 新增 | ||
32 | + </a> | ||
33 | + <a class="btn btn-outline btn-danger btn-rounded" onclick="$.operate.batRemove()" shiro:hasPermission="config:locationType:remove"> | ||
34 | + <i class="fa fa-trash-o"></i> 删除 | ||
35 | + </a> | ||
36 | + </div> | ||
37 | + | ||
38 | + <div class="col-sm-12 select-info"> | ||
39 | + <table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover"></table> | ||
40 | + </div> | ||
41 | + <div> | ||
42 | + </div> | ||
43 | + <div th:include="include :: footer"></div> | ||
44 | + <script th:inline="javascript"> | ||
45 | + var editFlag = [[${@permission.hasPermi('config:receiptType:edit')}]]; | ||
46 | + var removeFlag = [[${@permission.hasPermi('config:receiptType:remove')}]]; | ||
47 | + var prefix = ctx + "config/receiptType"; | ||
48 | + var datas = [[${@dict.getType('sys_normal_disable')}]]; | ||
49 | + $(function() { | ||
50 | + var options = { | ||
51 | + url: prefix + "/list", | ||
52 | + createUrl: prefix + "/add", | ||
53 | + updateUrl: prefix + "/edit/{id}", | ||
54 | + removeUrl: prefix + "/remove", | ||
55 | + modalName: "入库单类型", | ||
56 | + search: false, | ||
57 | + columns: [{ | ||
58 | + checkbox: true | ||
59 | + }, | ||
60 | + { | ||
61 | + field : 'id', | ||
62 | + title : '库位类型Id' | ||
63 | + }, | ||
64 | + { | ||
65 | + field : 'code', | ||
66 | + title : '类型编码' | ||
67 | + }, | ||
68 | + { | ||
69 | + field : 'companyCode', | ||
70 | + title : '货主编码' | ||
71 | + }, | ||
72 | + { | ||
73 | + field : 'warehouseCode', | ||
74 | + title : '仓库编码' | ||
75 | + }, | ||
76 | + { | ||
77 | + field : 'referType', | ||
78 | + title : '关联订单类型' | ||
79 | + }, | ||
80 | + { | ||
81 | + field : 'receiptFlow', | ||
82 | + title : '入库流程' | ||
83 | + }, | ||
84 | + { | ||
85 | + field : 'created', | ||
86 | + title : '创建时间' | ||
87 | + }, | ||
88 | + { | ||
89 | + field : 'createdBy', | ||
90 | + title : '创建用户' | ||
91 | + }, | ||
92 | + { | ||
93 | + field : 'lastUpdated', | ||
94 | + title : '更新时间' | ||
95 | + }, | ||
96 | + { | ||
97 | + field : 'lastUpdatedBy', | ||
98 | + title : '更新用户' | ||
99 | + }, | ||
100 | + { | ||
101 | + field : 'enable', | ||
102 | + title : '是否有效', | ||
103 | + formatter: function(value, row, index) { | ||
104 | + return $.table.selectDictLabel(datas, value); | ||
105 | + }, | ||
106 | + align: 'center', | ||
107 | + }, | ||
108 | + { | ||
109 | + field : 'version', | ||
110 | + title : '数据版本' | ||
111 | + }, | ||
112 | + { | ||
113 | + field : 'processStamp', | ||
114 | + title : '处理标记', | ||
115 | + visible : false | ||
116 | + }, | ||
117 | + { | ||
118 | + field : 'userDef1', | ||
119 | + title : '自定义字段1' , | ||
120 | + visible:false | ||
121 | + }, | ||
122 | + { | ||
123 | + field : 'userDef2', | ||
124 | + title : '自定义字段2' , | ||
125 | + visible:false | ||
126 | + }, | ||
127 | + { | ||
128 | + field : 'userDef3', | ||
129 | + title : '自定义字段3' , | ||
130 | + visible:false | ||
131 | + }, | ||
132 | + { | ||
133 | + field : 'userDef4', | ||
134 | + title : '自定义字段4' , | ||
135 | + visible:false | ||
136 | + }, | ||
137 | + { | ||
138 | + field : 'userDef5', | ||
139 | + title : '自定义字段5' , | ||
140 | + visible:false | ||
141 | + }, | ||
142 | + { | ||
143 | + title: '操作', | ||
144 | + align: 'center', | ||
145 | + formatter: function(value, row, index) { | ||
146 | + var actions = []; | ||
147 | + actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.id + '\')" ><i class="fa fa-edit"></i>编辑</a> '); | ||
148 | + actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.id + '\')" ><i class="fa fa-trash-o"></i>删除</a>'); | ||
149 | + return actions.join(''); | ||
150 | + } | ||
151 | + }] | ||
152 | + }; | ||
153 | + $.table.init(options); | ||
154 | + }); | ||
155 | + </script> | ||
156 | +</body> | ||
157 | +</html> | ||
0 | \ No newline at end of file | 158 | \ No newline at end of file |
src/main/resources/templates/general/carrier/add.html
0 → 100644
1 | +<!DOCTYPE HTML> | ||
2 | +<html lang="zh" xmlns:th="http://www.thymeleaf.org"> | ||
3 | +<meta charset="utf-8"> | ||
4 | +<head th:include="include :: header"></head> | ||
5 | +<body class="white-bg"> | ||
6 | +<div class="wrapper wrapper-content animated fadeInRight ibox-content"> | ||
7 | + <form class="form-horizontal m" id="form-company-add"> | ||
8 | + <div class="form-group"> | ||
9 | + <label class="col-sm-3 control-label">编码:</label> | ||
10 | + <div class="col-sm-8"> | ||
11 | + <input id="code" name="code" class="form-control" type="text"> | ||
12 | + </div> | ||
13 | + </div> | ||
14 | + <div class="form-group"> | ||
15 | + <label class="col-sm-3 control-label">名称:</label> | ||
16 | + <div class="col-sm-8"> | ||
17 | + <input id="name" name="name" class="form-control" type="text"> | ||
18 | + </div> | ||
19 | + </div> | ||
20 | + <div class="form-group"> | ||
21 | + <label class="col-sm-3 control-label">仓库:</label> | ||
22 | + <div class="col-sm-8"> | ||
23 | + <label th:each="warehouse:${warehouseList}" class="checkbox-inline i-checks"> | ||
24 | + <input name="warehouseCode" type="checkbox" th:value="${warehouse.value}" th:text=" ${warehouse.name}" th:disabled="${warehouse.enable == false} "> | ||
25 | + </label> | ||
26 | + </div> | ||
27 | + </div> | ||
28 | + <div class="form-group"> | ||
29 | + <label class="col-sm-3 control-label">运单获取地址url:</label> | ||
30 | + <div class="col-sm-8"> | ||
31 | + <input id="waybillServerUrl" name="waybillServerUrl" class="form-control" type="text"> | ||
32 | + </div> | ||
33 | + </div> | ||
34 | + | ||
35 | + <!--<div class="form-group"> | ||
36 | + <label class="col-sm-3 control-label">数据版本:</label> | ||
37 | + <div class="col-sm-8"> | ||
38 | + <input id="version" name="version" class="form-control" type="text"> | ||
39 | + </div> | ||
40 | + </div>--> | ||
41 | + | ||
42 | + <!--<div class="form-group"> --> | ||
43 | + <!--<label class="col-sm-3 control-label">自定义字段1:</label>--> | ||
44 | + <!--<div class="col-sm-8">--> | ||
45 | + <!--<input id="userDef1" name="userDef1" class="form-control" type="text">--> | ||
46 | + <!--</div>--> | ||
47 | + <!--</div>--> | ||
48 | + <!--<div class="form-group"> --> | ||
49 | + <!--<label class="col-sm-3 control-label">自定义字段2:</label>--> | ||
50 | + <!--<div class="col-sm-8">--> | ||
51 | + <!--<input id="userDef2" name="userDef2" class="form-control" type="text">--> | ||
52 | + <!--</div>--> | ||
53 | + <!--</div>--> | ||
54 | + <!--<div class="form-group"> --> | ||
55 | + <!--<label class="col-sm-3 control-label">自定义字段3:</label>--> | ||
56 | + <!--<div class="col-sm-8">--> | ||
57 | + <!--<input id="userDef3" name="userDef3" class="form-control" type="text">--> | ||
58 | + <!--</div>--> | ||
59 | + <!--</div>--> | ||
60 | + <div class="form-group"> | ||
61 | + <div class="form-control-static col-sm-offset-9"> | ||
62 | + <button type="submit" class="btn btn-primary">提交</button> | ||
63 | + <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button> | ||
64 | + </div> | ||
65 | + </div> | ||
66 | + </form> | ||
67 | +</div> | ||
68 | +<div th:include="include::footer"></div> | ||
69 | +<script type="text/javascript"> | ||
70 | + var prefix = ctx + "general/company" | ||
71 | + $("#form-company-add").validate({ | ||
72 | + rules:{ | ||
73 | + code:{ | ||
74 | + required:true | ||
75 | + }, | ||
76 | + name:{ | ||
77 | + required:true | ||
78 | + }, | ||
79 | + }, | ||
80 | + submitHandler: function() { | ||
81 | + var tableValue = $("#form-bomHeader-add").serialize(); | ||
82 | + tableValue = formValueReplace(tableValue, "warehouseCode", $.form.selectCheckeds("warehouseCode")); | ||
83 | + $.operate.save(prefix + "/add", tableValue); | ||
84 | + } | ||
85 | + }); | ||
86 | +</script> | ||
87 | +</body> | ||
88 | +</html> |