Explorar el Código

품목 관리 엑셀 업로드

marseyes hace 2 años
padre
commit
6ffccc4445

+ 21 - 0
src/main/webapp/app/stinfo/STINFO04010.html

@@ -7,8 +7,13 @@
7 7
 					<button type="button" id="ITP_BTN_STINFO04010_SRH" class="btn btn-success btn-sm SEB" style="display: inline-block;"><i class="glyphicon"></i>&nbsp;&nbsp;조회&nbsp;&nbsp;</button>
8 8
 					<button type="button" id="ITP_BTN_STINFO04010_MODIFY" class="btn btn-success btn-sm UPB" style="display: inline-block;"><i class="glyphicon"></i>&nbsp;&nbsp;수정&nbsp;&nbsp;</button>
9 9
 					<button type="button" id="ITP_BTN_STINFO04010_NEWREG" class="btn btn-primary btn-sm NEB" style="display: inline-block;"><i class="glyphicon"></i>&nbsp;&nbsp;신규등록&nbsp;&nbsp;</button>
10
+					
11
+					<button type="button" id="ITP_BTN_STINFO04010_TEMPLATE_DOWNLOAD" class="btn btn-primary btn-sm UPLD"><i class="glyphicon "></i>&nbsp;&nbsp;템플릿다운로드&nbsp;&nbsp;</button>
12
+					<button type="button" id="ITP_BTN_STINFO04010_FILE_UPLOAD" class="btn btn-warning btn-sm UPLD"><i class="glyphicon "></i>&nbsp;&nbsp;파일업로드&nbsp;&nbsp;</button>
13
+					
10 14
 					<button type="button" id="ITP_BTN_STINFO04010_SAVE" class="btn btn-success btn-sm SAB"><i class="glyphicon"></i>&nbsp;&nbsp;저장&nbsp;&nbsp;</button>
11 15
 					<button type="button" id="ITP_BTN_STINFO04010_CANCELLIST" class="btn btn-warning btn-sm PRB"><i class="glyphicon"></i>&nbsp;&nbsp;취소/목록&nbsp;&nbsp;</button>
16
+					<button type="button" id="ITP_BTN_STINFO04010_UPLOAD" class="btn btn-warning btn-sm UPLD"><i class="glyphicon"></i>&nbsp;&nbsp;엑셀업로드&nbsp;&nbsp;</button>
12 17
 				</div>					
13 18
 			</div>
14 19
 			<div class="itp_det_in">
@@ -80,6 +85,22 @@
80 85
 						</div>
81 86
 					</div>
82 87
 				</div>
88
+				<div id="ITP_AJAX_STINFO04010_UPLOAD_CONTAINER">
89
+					<form id="ITP_FORM_STINFO04010_UPLOAD" class="form-horizontal">
90
+						<input type="hidden" id="ITP_FORM_STINFO04010_UPLOAD_BRAND_ID" name="brandId" />
91
+						<input id="ITP_FORM_STINFO04010_UPLOAD_EXCEL_UPLOAD_SELECT_FILE" type="file" style="display:none;" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
92
+															
93
+					</form>
94
+					
95
+					<div class="itp_table fix">
96
+						<div id="ITP_STINFO04010_UPLOAD_jqGrid_list" class="itp_tb_list itp_gType1" data-total-cnt="${totalCnt}">
97
+							<div id="ITP_STINFO04010_UPLOAD_jqGridView" class="itp_views fix"></div>
98
+							<table id="ITP_STINFO04010_UPLOAD_jqGrid"></table>
99
+							<div id="ITP_STINFO04010_UPLOAD_jqGridPager"></div>
100
+							<div id="ITP_STINFO04010_UPLOAD_jqGridEmpty" class="itp_no_data"></div>
101
+						</div>
102
+					</div>
103
+				</div>
83 104
 				<div id="ITP_AJAX_STINFO04010_DETAIL_CONTAINER">
84 105
 					<div class="itp_form itp_type1 fix">
85 106
 						<div class="col-xs-12">

+ 489 - 17
src/main/webapp/js/app/stinfo/ITP_STINFO04010.js

@@ -1,6 +1,7 @@
1 1
 require(['config'], function() {
2 2
     require([
3
-        'jquery.bootstrap.fileUpload' //파일 업로드가 있는 페이지에서 로딩
3
+		'jquery.bootstrap.fileUpload',	//파일 업로드가 있는 페이지에서 로딩
4
+		'xlsx' 		// 엑셀 다운로드
4 5
     ], function($) {
5 6
         pageObj.init();
6 7
     });
@@ -24,6 +25,11 @@ const STINFO04010_GRID_LIST = '#ITP_STINFO04010_jqGrid_list';
24 25
 const STINFO04010_GRID_PAGER = '#ITP_STINFO04010_jqGridPager';
25 26
 const STINFO04010_GRID_EMPTY = '#ITP_STINFO04010_jqGridEmpty';
26 27
 
28
+const STINFO04010_UPLOAD_GRID_ID = '#ITP_STINFO04010_UPLOAD_jqGrid';
29
+const STINFO04010_UPLOAD_GRID_LIST = '#ITP_STINFO04010_UPLOAD_jqGrid_list';
30
+const STINFO04010_UPLOAD_GRID_PAGER = '#ITP_STINFO04010_UPLOAD_jqGridPager';
31
+const STINFO04010_UPLOAD_GRID_EMPTY = '#ITP_STINFO04010_UPLOAD_jqGridEmpty';
32
+
27 33
 const STINFO04010_VIEW_GRID_ID = '#ITP_STINFO04010_VIEW_jqGrid';
28 34
 const STINFO04010_VIEW_GRID_LIST = '#ITP_STINFO04010_VIEW_jqGrid_list';
29 35
 const STINFO04010_VIEW_GRID_PAGER = '#ITP_STINFO04010_VIEW_jqGridPager';
@@ -37,13 +43,18 @@ const STINFO04010_DETAIL_GRID_EMPTY = '#ITP_STINFO04010_DETAIL_jqGridEmpty';
37 43
 let ITP_FORM_STINFO04010_DETAIL_IS_DUPLICATE = false;
38 44
 let ITP_FORM_STINFO04010_DETAIL_IS_WRITING = false;
39 45
 
46
+let STINFO04010_UPLOAD_GRID_LAST_ROW_ID;
47
+
40 48
 /*API URL*/
41 49
 let API_DETAIL_GRID_LIST 	= '/api/item/detail-grid-list';	    // 목록
42 50
 let API_DETAIL_INFO 		= '/api/item/info-item';			// 상세
43 51
 let API_DETAIL_SAVE 		= '/api/item/save-item';			// 저장
52
+let API_DETAIL_SAVE_LIST 	= '/api/item/save-item-list';		// 일괄저장
44 53
 let API_ITEM_CLASS_LEVEL	= '/api/item/class-level-list';		//품목분류 level 검색
45 54
 let API_GET_KEY			 	= '/api/session/get-key';
46 55
 
56
+let SCREEN_MODE;
57
+
47 58
 /*화면 Grid ColModel*/
48 59
 const gridColModel = {
49 60
     list: [
@@ -113,6 +124,184 @@ const gridColModel = {
113 124
             width: '8', fixed: false, align: 'center',
114 125
             sortable: false, hidden: false
115 126
         },
127
+    ],
128
+	upload: [
129
+		{
130
+			index: 'VIEW_CD', name: 'viewCd',
131
+			label: ITP_MSG_LOCALE.label.viewCd,
132
+			width: '10', fixed: false, align: 'center',
133
+			sortable: false, hidden: true
134
+		},
135
+		{
136
+			index: 'NORMAL_YN', name: 'normalYn',
137
+			label: "정상여부",
138
+			width: '10', fixed: false, align: 'center',
139
+			minwidth: 150, maxwidth: 250,
140
+			sortable: false, editable: false, edittype: 'text',
141
+			editrules: {required: false}
142
+		},
143
+		{
144
+			index: 'ERROR_MSG', name: 'errorMsg',
145
+			label: "에러메시지",
146
+			width: '15', fixed: false, align: 'center',
147
+			minwidth: 150, maxwidth: 300,
148
+			sortable: false, editable: false, edittype: 'text',
149
+			editrules: {required: false}
150
+		},
151
+        {
152
+            index: 'ITEM_NM', name: 'itemNm',
153
+            label: ITP_MSG_LOCALE.label.itemNm, //품목명
154
+            width: '13', fixed: false, align: 'left',
155
+			minwidth: 150, maxwidth: 250,
156
+            sortable: false, hidden: false
157
+        },
158
+        {
159
+            index: 'ITEM_TYPE_NM', name: 'itemTypeNm',
160
+            label: ITP_MSG_LOCALE.label.itemTypeNm, //품목유형
161
+            width: '10', fixed: false, align: 'center',
162
+			minwidth: 150, maxwidth: 250,
163
+            sortable: false, hidden: false
164
+        },
165
+		{
166
+            index: 'IMP_DVSN_NM', name: 'impDvsnNm',
167
+            label: '내외자구분', 
168
+            width: '10', fixed: false, align: 'center',
169
+			minwidth: 150, maxwidth: 250, 
170
+			sortable: false, hidden: false
171
+        },
172
+		{
173
+            index: 'PODR_PSSBL_DVSN_NM', name: 'podrPssblDvsnNm',
174
+            label: '발주여부', 
175
+            width: '10', fixed: false, align: 'center',
176
+			minwidth: 150, maxwidth: 250, 
177
+			sortable: false, hidden: false
178
+        },
179
+		{
180
+            index: 'UNIT_NM', name: 'unitNm',
181
+            label: '기본단위', 
182
+            width: '10', fixed: false, align: 'center',
183
+			minwidth: 150, maxwidth: 250, 
184
+			sortable: false, hidden: false
185
+        },
186
+		{
187
+            index: 'PCH_ITEM_YN', name: 'pchItemYn',
188
+            label: '구매품목여부', 
189
+            width: '10', fixed: false, align: 'center', 
190
+			minwidth: 150, maxwidth: 250,
191
+			sortable: false, hidden: false
192
+        },
193
+		{
194
+            index: 'SALE_ITEM_YN', name: 'saleItemYn',
195
+            label: '판매품목여부', 
196
+            width: '10', fixed: false, align: 'center', 
197
+			minwidth: 150, maxwidth: 250,
198
+			sortable: false, hidden: false
199
+        },
200
+		{
201
+            index: 'WEIGHT', name: 'weight',
202
+            label: '중량 값', 
203
+            width: '6', fixed: false, align: 'center', 
204
+			minwidth: 150, maxwidth: 250,
205
+			sortable: false, hidden: false
206
+        },
207
+		{
208
+            index: 'WEIGHT_UNIT_NM', name: 'weightUnitNm',
209
+            label: '중량 단위', 
210
+            width: '6', fixed: false, align: 'center', 
211
+			minwidth: 150, maxwidth: 250,
212
+			sortable: false, hidden: false
213
+        },
214
+		{
215
+            index: 'VOLUME', name: 'volume',
216
+            label: '부피 값', 
217
+            width: '6', fixed: false, align: 'center', 
218
+			minwidth: 150, maxwidth: 250,
219
+			sortable: false, hidden: false
220
+        },
221
+		{
222
+            index: 'VOLUME_UNIT_NM', name: 'volumeUnitNm',
223
+            label: '부피 단위', 
224
+            width: '6', fixed: false, align: 'center', 
225
+			minwidth: 150, maxwidth: 250,
226
+			sortable: false, hidden: false
227
+        },
228
+		{
229
+            index: 'WIDTH', name: 'width',
230
+            label: '가로 값', 
231
+            width: '6', fixed: false, align: 'center', 
232
+			minwidth: 150, maxwidth: 250,
233
+			sortable: false, hidden: false
234
+        },
235
+		{
236
+            index: 'WIDTH_UNIT_NM', name: 'widthUnitNm',
237
+            label: '가로 단위', 
238
+            width: '6', fixed: false, align: 'center', 
239
+			minwidth: 150, maxwidth: 250,
240
+			sortable: false, hidden: false
241
+        },
242
+		{
243
+            index: 'HEIGHT', name: 'height',
244
+            label: '세로 값', 
245
+            width: '6', fixed: false, align: 'center', 
246
+			minwidth: 150, maxwidth: 250,
247
+			sortable: false, hidden: false
248
+        },
249
+		{
250
+            index: 'HEIGHT_UNIT_NM', name: 'heightUnitNm',
251
+            label: '세로 단위', 
252
+            width: '6', fixed: false, align: 'center', 
253
+			minwidth: 150, maxwidth: 250,
254
+			sortable: false, hidden: false
255
+        },
256
+		{
257
+            index: 'HIGH', name: 'high',
258
+            label: '높이 값', 
259
+            width: '6', fixed: false, align: 'center', 
260
+			minwidth: 150, maxwidth: 250,
261
+			sortable: false, hidden: false
262
+        },
263
+		{
264
+            index: 'HIGH_UNIT_NM', name: 'highUnitNm',
265
+            label: '높이 단위', 
266
+            width: '6', fixed: false, align: 'center', 
267
+			minwidth: 150, maxwidth: 250,
268
+			sortable: false, hidden: false
269
+        },
270
+		{
271
+            index: 'EXPRY_YN', name: 'expryYn',
272
+            label: '유통기한여부', 
273
+            width: '10', fixed: false, align: 'center', 
274
+			minwidth: 150, maxwidth: 250,
275
+			sortable: false, hidden: false
276
+        },
277
+		{
278
+            index: 'EXPRY_PERIOD', name: 'expryPeriod',
279
+            label: '유통가능기간', 
280
+            width: '10', fixed: false, align: 'center', 
281
+			minwidth: 150, maxwidth: 250,
282
+			sortable: false, hidden: false
283
+        },
284
+		{
285
+            index: 'RTN_PSSBL_YN', name: 'rtnPssblYn',
286
+            label: '반품가능여부', 
287
+            width: '10', fixed: false, align: 'center', 
288
+			minwidth: 150, maxwidth: 250,
289
+			sortable: false, hidden: false
290
+        },
291
+		{
292
+            index: 'RTN_DVSN_NM', name: 'rtnDvsnNm',
293
+            label: '반품구분', 
294
+            width: '10', fixed: false, align: 'center', 
295
+			minwidth: 150, maxwidth: 250,
296
+			sortable: false, hidden: false
297
+        },
298
+		{
299
+            index: 'BARCODE', name: 'barcode',
300
+            label: '바코드', 
301
+            width: '10', fixed: false, align: 'center', 
302
+			minwidth: 150, maxwidth: 250,
303
+			sortable: false, hidden: false
304
+        }		
116 305
     ],
117 306
     detail: [
118 307
         {
@@ -199,10 +388,13 @@ let pageObj = {
199 388
                         case 'ITP_BTN_STINFO04010_NEWREG'			: listObj.button.create(); 		break;	// 신규등록 버튼
200 389
                         case 'ITP_BTN_STINFO04010_MODIFY'			: modifyObj.button.modify();	break;	// 수정 버튼
201 390
                         case 'ITP_BTN_STINFO04010_CANCELLIST'		: createObj.button.cancel(); 	break;	// 취소/목록 버튼
391
+                        case 'ITP_BTN_STINFO04010_UPLOAD'			: listObj.button.upload(); 		break;	// 엑셀업로드 버튼
202 392
                         case 'ITP_BTN_STINFO04010_DELETE'			: 								break;	// 삭제 버튼
203 393
                         case 'ITP_BTN_STINFO04010_SAVE'				: createObj.button.save(); 		break;	// 저장 버튼
204 394
                         case 'ITP_FORM_STINFO04010_DETAIL_DUP'		: createObj.button.duplicate();	break;	// 중복체크
205 395
                         case 'ITP_BTN_STINFO04010_RESET_PW'			: createObj.button.resetPass();	break;	// 상세:비밀번호 초기화
396
+                        case 'ITP_BTN_STINFO04010_TEMPLATE_DOWNLOAD'	: uploadObj.button.downTemplate();	break;	// 템플릿 다운로드
397
+                        case 'ITP_BTN_STINFO04010_FILE_UPLOAD'		: uploadObj.button.uploadFile();	break;	// 파일 업로드
206 398
                     }
207 399
                 });
208 400
             });
@@ -229,6 +421,8 @@ let pageObj = {
229 421
         itp_fn_set_file_upload('ITP_' + id + '_DETAIL_UPLOAD', 'affl', true, false, id, fileArgs);
230 422
     },
231 423
     switchScreen: function(mode) {
424
+		SCREEN_MODE = mode;
425
+	
232 426
         $('.itp_det_head').find('button[id^="ITP_BTN_STINFO04010_"]').each(function(i) {
233 427
             $(this).hide();
234 428
         });
@@ -237,8 +431,14 @@ let pageObj = {
237 431
         });
238 432
         if(mode == 'LIST') { // 목록
239 433
             $('#ITP_AJAX_STINFO04010_LIST_CONTAINER').show();
240
-            fn_show_btn_auth_array(['#ITP_BTN_STINFO04010_SRH', '#ITP_BTN_STINFO04010_NEWREG']);
434
+            fn_show_btn_auth_array(['#ITP_BTN_STINFO04010_SRH', '#ITP_BTN_STINFO04010_NEWREG', '#ITP_BTN_STINFO04010_UPLOAD']);
241 435
             $('#ITP_FORM_STINFO04010_SEARCH_BRAND_ID').val(fn_make_user_info.get('brandId'));
436
+
437
+        } else if(mode == 'UPLOAD') { // 엑셀업로드
438
+			$('#ITP_AJAX_STINFO04010_UPLOAD_CONTAINER').show();
439
+			fn_show_btn_auth_array(['#ITP_BTN_STINFO04010_FILE_UPLOAD','#ITP_BTN_STINFO04010_TEMPLATE_DOWNLOAD','#ITP_BTN_STINFO04010_SAVE', '#ITP_BTN_STINFO04010_CANCELLIST']);
440
+            $('#ITP_FORM_STINFO04010_UPLOAD_BRAND_ID').val(fn_make_user_info.get('brandId'));
441
+
242 442
         } else if(mode == 'ADD') { // 등록
243 443
             $('#ITP_AJAX_STINFO04010_DETAIL_CONTAINER').show();
244 444
             fn_show_btn_auth_array(['#ITP_BTN_STINFO04010_CANCELLIST', '#ITP_BTN_STINFO04010_SAVE']);
@@ -300,7 +500,12 @@ let listObj = {
300 500
             if(!fn_make_user_info.isEmpty()) {
301 501
                 createObj.init();
302 502
             }
303
-        }
503
+        }, 
504
+		upload: function() {
505
+			if(!fn_make_user_info.isEmpty()) {
506
+                uploadObj.init();
507
+            }
508
+		}
304 509
     },
305 510
     form: function() {
306 511
         $('#ITP_FORM_STINFO04010_SEARCH_ITEM_CLASS1').on('change', function() {
@@ -453,7 +658,6 @@ let viewObj = {
453 658
 		$('#ITP_FORM_STINFO04010_VIEW .fnOqMenuCd').text(result.oqMenuCd);
454 659
 		$('#ITP_FORM_STINFO04010_VIEWL #ITP_FORM_STINFO04010_VIEW_OQ_BRAND_ID').val(result.oqBrandId);
455 660
 
456
-
457 661
         itp_fn_attach_file.view('ITP_FORM_STINFO04010_VIEW_FILE', result.imageFileNoList
458 662
             , 'form-control itp_input', 'border:none; top:12px; left:12px; height:100px; width:125px; position:absolute;');
459 663
 
@@ -526,6 +730,231 @@ let modifyObj = {
526 730
     }
527 731
 };
528 732
 
733
+/* 엑셀업로드 화면 */
734
+let uploadObj = {
735
+	init: function () {
736
+		this.grid.init();
737
+		this.change();
738
+	}, 
739
+	button: {
740
+        downTemplate: function() {
741
+            var lidx = window.location.href.lastIndexOf('/');
742
+			window.location.assign(window.location.href.substring(0, lidx) + '/excel_template/item_upload_v1.xlsx');
743
+        },
744
+        uploadFile: function() {
745
+        	uploadObj.grid.clearData();
746
+			// 파일선택
747
+			$('#ITP_FORM_STINFO04010_UPLOAD_EXCEL_UPLOAD_SELECT_FILE').click();
748
+        }, 
749
+		makeExcelDataList: function(excelData) {
750
+			var processArray = [];
751
+			
752
+			excelData.shift();
753
+			excelData.shift();
754
+			excelData.some(function(data) {
755
+				var processData = {};				
756
+				processData.itemNm 	= data.A.toString(); 		
757
+				processData.itemTypeNm 	= data.B.toString(); 		
758
+				processData.impDvsnNm 			= data.C.toString(); 	
759
+				processData.podrPssblDvsnNm 	= data.D.toString(); 	
760
+				processData.unitNm 		= data.E.toString(); 	
761
+				processData.pchItemYn 	= data.F.toString(); 	
762
+				processData.saleItemYn 	= data.G.toString(); 	
763
+				processData.weight 			= data.H.toString(); 	
764
+				processData.weightUnitNm 	= data.I.toString(); 	
765
+				processData.volume 			= data.J.toString(); 	
766
+				processData.volumeUnitNm 	= data.K.toString(); 	
767
+				processData.width 	= data.L.toString(); 	
768
+				processData.widthUnitNm 	= data.M.toString(); 	
769
+				processData.height 	= data.N.toString(); 	
770
+				processData.heightUnitNm 	= data.O.toString(); 	
771
+				processData.high 	= data.P.toString(); 	
772
+				processData.highUnitNm 	= data.Q.toString(); 	
773
+				processData.expryYn 	= data.R.toString(); 	
774
+				processData.expryPeriod 	= data.S.toString(); 	
775
+				processData.rtnPssblYn 	= data.T.toString(); 	
776
+				processData.rtnDvsnNm 	= data.U.toString(); 	
777
+				processData.barcode 	= data.V.toString(); 	
778
+				processArray.push(processData);
779
+			});
780
+			
781
+			$.each(processArray, function(key, value) {
782
+				
783
+				var normalYn = 'Y';
784
+				var errorMsg = '';
785
+			
786
+				// console.log(JSON.stringify(value));
787
+				// 코드값 체크
788
+				if("소모품:자산용".indexOf(value.itemTypeNm) < 0) {
789
+					normalYn = 'N';
790
+					errorMsg += '품목유형;';
791
+				} 
792
+				if("국내:수입".indexOf(value.impDvsnNm) < 0) {
793
+					normalYn = 'N';
794
+					errorMsg += '내외자구분;';
795
+				}
796
+				if("발주가능:발주불가".indexOf(value.podrPssblDvsnNm) < 0) {
797
+					normalYn = 'N';
798
+					errorMsg += '발주여부;';
799
+				}
800
+				if("부피:개수:박스".indexOf(value.unitNm) < 0) {
801
+					normalYn = 'N';
802
+					errorMsg += '기본단위;';
803
+				}
804
+				if("Y:N".indexOf(value.pchItemYn) < 0) {
805
+					normalYn = 'N';
806
+					errorMsg += '구매품목여부;';
807
+				}
808
+				if("Y:N".indexOf(value.saleItemYn) < 0) {
809
+					normalYn = 'N';
810
+					errorMsg += '판매품목여부;';
811
+				}
812
+				if("kg:g:mg:ton".indexOf(value.weightUnitNm) < 0) {
813
+					normalYn = 'N';
814
+					errorMsg += '중량단위;';
815
+				}
816
+				if("cm³:m³:L:ml".indexOf(value.volumeUnitNm) < 0) {
817
+					normalYn = 'N';
818
+					errorMsg += '부피단위;';
819
+				}
820
+				if("cm:m:mm:km:inch:ft:yd".indexOf(value.widthUnitNm) < 0) {
821
+					normalYn = 'N';
822
+					errorMsg += '가로단위;';
823
+				}
824
+				if("cm:m:mm:km:inch:ft:yd".indexOf(value.heightUnitNm) < 0) {
825
+					normalYn = 'N';
826
+					errorMsg += '세로단위;';
827
+				}
828
+				if("cm:m:mm:km:inch:ft:yd".indexOf(value.highUnitNm) < 0) {
829
+					normalYn = 'N';
830
+					errorMsg += '높이단위;';
831
+				}
832
+				if("Y:N".indexOf(value.expryYn) < 0) {
833
+					normalYn = 'N';
834
+					errorMsg += '유통기한여부;';
835
+				}
836
+				if("Y:N".indexOf(value.rtnPssblYn) < 0) {
837
+					normalYn = 'N';
838
+					errorMsg += '반품가능여부;';
839
+				}
840
+				if("실물반품:폐기반품".indexOf(value.rtnDvsnNm) < 0) {
841
+					normalYn = 'N';
842
+					errorMsg += '반품구분;';
843
+				}
844
+								
845
+				// 행추가
846
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('addRow', {position: 'last'});
847
+				var rids = $(STINFO04010_UPLOAD_GRID_ID).jqGrid('getDataIDs');
848
+				var last_row_id = rids[rids.length - 1];
849
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'viewCd', 'C');					
850
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'normalYn', normalYn); // 정상여부
851
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'errorMsg', errorMsg); 
852
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'itemNm', value.itemNm);				
853
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'itemTypeNm', value.itemTypeNm);				
854
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'impDvsnNm', value.impDvsnNm);	
855
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'podrPssblDvsnNm', value.podrPssblDvsnNm);	
856
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'unitNm', value.unitNm);	
857
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'pchItemYn', value.pchItemYn);	
858
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'saleItemYn', value.saleItemYn);	
859
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'weight', value.weight);	
860
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'weightUnitNm', value.weightUnitNm);	
861
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'volume', value.volume);	
862
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'volumeUnitNm', value.volumeUnitNm);	
863
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'width', value.width);	
864
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'widthUnitNm', value.widthUnitNm);	
865
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'height', value.height);	
866
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'heightUnitNm', value.heightUnitNm);	
867
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'high', value.high);	
868
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'highUnitNm', value.highUnitNm);	
869
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'expryYn', value.expryYn);	
870
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'expryPeriod', value.expryPeriod);	
871
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'rtnPssblYn', value.rtnPssblYn);	
872
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'rtnDvsnNm', value.rtnDvsnNm);	
873
+				$(STINFO04010_UPLOAD_GRID_ID).jqGrid('setCell', last_row_id, 'barcode', value.barcode);	
874
+		 	});
875
+			$(STINFO04010_UPLOAD_GRID_EMPTY).hide();
876
+							
877
+		}
878
+    }, 
879
+	change: function() {
880
+		// 파일선택
881
+		$(document).on('change', '#ITP_FORM_STINFO04010_UPLOAD_EXCEL_UPLOAD_SELECT_FILE', function(obj) {						
882
+			var input = obj.target;
883
+		    var reader = new FileReader();
884
+			var rABS = !!reader.readAsBinaryString;
885
+		    reader.onload = function(){
886
+		        var fileData = reader.result;
887
+		        var wb = XLSX.read(fileData, {type : rABS ? 'binary' : 'array'});
888
+		        var sheetNameList = wb.SheetNames; // 시트 이름 목록 가져오기 
889
+		        var firstSheetName = sheetNameList[0]; // 첫번째 시트명
890
+		        var firstSheet = wb.Sheets[firstSheetName]; // 첫번째 시트 
891
+		        var rowObj =XLSX.utils.sheet_to_json(firstSheet, {header:"A", defval: ""});
892
+
893
+				console.log(JSON.stringify(rowObj));
894
+				// console.log(rowObj.length);
895
+				
896
+				$('#ITP_FORM_STINFO04010_UPLOAD_EXCEL_UPLOAD_SELECT_FILE').val('');
897
+				if(rowObj.length < 3) {
898
+					itp_fn_modal_alert_ajax('엑셀파일에 품목 데이터를 기술하세요.');
899
+					return;
900
+				} else if(rowObj.length > 1001) {
901
+					itp_fn_modal_alert_ajax('엑셀 일괄처리는 최대 1000건까지 가능합니다.');
902
+					return;
903
+				}				
904
+				
905
+				uploadObj.button.makeExcelDataList(rowObj);				
906
+		    };
907
+		    if(rABS) reader.readAsBinaryString(input.files[0]); 
908
+			else reader.readAsArrayBuffer(input.files[0]);			
909
+		});
910
+	}, 
911
+	grid: {
912
+        init: function () {
913
+            this.search();
914
+        },
915
+        colModel: gridColModel.upload,
916
+        search: function() {
917
+            pageObj.switchScreen('UPLOAD');
918
+            this.unload();
919
+            this.load();
920
+        },
921
+        load: function() {
922
+            let param = $('#ITP_FORM_STINFO04010_SEARCH').serializeObject();
923
+            param.gridSize = $.jgrid.defaults.rowNum;
924
+            param.sbrandId = fn_make_user_info.get('brandId');
925
+			param.uploadYn = "Y"; // 엑셀업로드 여부
926
+
927
+            var option = {
928
+                gridId: STINFO04010_UPLOAD_GRID_ID,
929
+                colModel: gridColModel.upload,
930
+                param: param,
931
+                url: DOMAIN + API_DETAIL_GRID_LIST,
932
+                pager: STINFO04010_UPLOAD_GRID_PAGER,
933
+                onCellSelect: function(rowId, cellIdx, cellValue) {
934
+					// STINFO04010_UPLOAD_GRID_LAST_ROW_ID = itp_fn_set_data_editable(rowId, cellIdx, STINFO04010_UPLOAD_GRID_LAST_ROW_ID, STINFO04010_UPLOAD_GRID_ID, ['itemId']);
935
+                },
936
+                loadComplete: function(data) {
937
+                    // console.log(data);
938
+                    itp_fn_grid_load_complete(data, STINFO04010_UPLOAD_GRID_ID, true, 'number', 'STINFO04010', listObj.itp_STINFO04010_search, listObj.empty, true, data.gridRecords, true);                    
939
+                },
940
+                onPaging: function(action) {
941
+                    itp_fn_grid_paging(STINFO04010_UPLOAD_GRID_ID, action, param);
942
+                }
943
+            };
944
+            itp_fn_grid_make_remote(option);
945
+        },
946
+        clearData : function() {
947
+            $(STINFO04010_UPLOAD_GRID_ID).jqGrid('clearGridData', true);
948
+            $(STINFO04010_UPLOAD_GRID_LIST).find('.ui-jqgrid-bdiv').css('min-height', '100px');
949
+            $(STINFO04010_UPLOAD_GRID_EMPTY).html(ITP_MSG_LOCALE.message.grid.noData);
950
+            $(STINFO04010_UPLOAD_GRID_EMPTY).show();
951
+        },
952
+        unload : function() {
953
+            $.jgrid.gridUnload(STINFO04010_UPLOAD_GRID_ID);
954
+        }
955
+    }
956
+}
957
+
529 958
 /*신규화면 Object*/
530 959
 let createObj = {
531 960
     init: function () {
@@ -537,7 +966,7 @@ let createObj = {
537 966
         itemClassLevel.make(1, 'ADD');
538 967
     },
539 968
 	load: function() {
540
-		console.log("====================");
969
+		// console.log("====================");
541 970
 		var param = {keyType:"It"};
542 971
         fn_ajax_call(API_GET_KEY, param, this.callback, 'GET');
543 972
     },
@@ -565,18 +994,61 @@ let createObj = {
565 994
             listObj.grid.search();
566 995
         },
567 996
         save: function() {
568
-            const formId = '#ITP_FORM_STINFO04010_DETAIL';
569
-            itp_fn_form_clear_validate(null, formId);
570
-
571
-            if (itp_fn_form_event.isValid(formId)) {
572
-                let param = $(formId).serializeObject();
573
-                console.log(JSON.stringify(param));
574
-                var searhFn = function() {
575
-                    ITP_FORM_STINFO04010_DETAIL_IS_WRITING = false;
576
-                    listObj.grid.search();
577
-                };
578
-                fn_ajax_call(API_DETAIL_SAVE, JSON.stringify(param), searhFn, 'POST');
579
-            }
997
+			if(SCREEN_MODE == 'UPLOAD') { // 엑셀 일괄저장
998
+				// 그리드 체크
999
+				var reccount = $(STINFO04010_UPLOAD_GRID_ID).getGridParam("reccount");
1000
+				if(reccount < 1) {
1001
+					return;
1002
+				}
1003
+				let check = true;
1004
+				const rowData = $(STINFO04010_UPLOAD_GRID_ID).getRowData();
1005
+				$.each(rowData, function(key, value) {
1006
+					if(check) {
1007
+						if(value.normalYn == 'N') {
1008
+							check = false;
1009
+						}							
1010
+					}							
1011
+				});
1012
+				if(!check) {
1013
+					itp_fn_modal_alert_ajax('비정상 데이터가 포함되어 있습니다.');
1014
+					return;
1015
+				}
1016
+				
1017
+				var modalFn = {
1018
+					callBack: () => {						
1019
+						const formId = '#ITP_FORM_STINFO04010_UPLOAD';						
1020
+						
1021
+						let gridInsertData = [];						
1022
+						$.each(rowData, function(key, value) {
1023
+							gridInsertData.push(value);
1024
+						});
1025
+						
1026
+						let param = $(formId).serializeObject();
1027
+						param.list = gridInsertData;
1028
+						
1029
+						var searhFn = function() {
1030
+		                    ITP_FORM_STINFO04010_DETAIL_IS_WRITING = false;
1031
+		                    listObj.grid.search();
1032
+		                };
1033
+		                fn_ajax_call(API_DETAIL_SAVE_LIST, JSON.stringify(param), searhFn, 'POST');
1034
+					}
1035
+				};
1036
+				itp_fn_modal_confirm('저장 하시겠습니까?', modalFn);				
1037
+				
1038
+			} else {
1039
+				const formId = '#ITP_FORM_STINFO04010_DETAIL';
1040
+	            itp_fn_form_clear_validate(null, formId);
1041
+	
1042
+	            if (itp_fn_form_event.isValid(formId)) {
1043
+	                let param = $(formId).serializeObject();
1044
+	                // console.log(JSON.stringify(param));
1045
+	                var searhFn = function() {
1046
+	                    ITP_FORM_STINFO04010_DETAIL_IS_WRITING = false;
1047
+	                    listObj.grid.search();
1048
+	                };
1049
+	                fn_ajax_call(API_DETAIL_SAVE, JSON.stringify(param), searhFn, 'POST');
1050
+	            }	
1051
+			}
580 1052
         }
581 1053
     }
582 1054
 };