196645244855e06308bed551197d92bcebdab6e4.svn-base 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. BemsWebApplication.Material = function (params, viewInfo) {
  2. "use strict";
  3. var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
  4. var materialClass = ko.observableArray();
  5. var materialClassForSearch = ko.observableArray();
  6. var businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
  7. materialClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass', true, true),
  8. materialClassDataSource2 = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass', true, true),
  9. materialTypeDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeType', true, true),
  10. tradeCompanyDataSource = BemsWebApplication.db.createDataSource('FmsMaterialTradeCompany', true, true),
  11. warehouseDataSource = BemsWebApplication.db.createDataSource('FmsMaterialWarehouse', true, true),
  12. locationDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeLocation', true, true);
  13. var filePath = "/App_Data/files/form/자재등록양식.xlsx";
  14. var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter;
  15. var FmsMaterialDataSource = BemsWebApplication.db.createDataSource('FmsMaterial');
  16. var MaterialInfo = ko.observableArray();
  17. var RowName, RowBusinessFieldId, RowMaterialTypeId;
  18. var userMaterialCode1st = ko.observable(''),
  19. userMaterialCode2nd = ko.observable(''),
  20. userMaterialCode3rd = ko.observable(''),
  21. userMateialSeq = ko.observable('');
  22. var isEditModeInPopup = ko.observable(false);
  23. var materialCodesDataSource = BWA.DataUtil.createDataSource({
  24. dataSourceOptions: {
  25. paginate: false,
  26. select: [
  27. 'SiteId',
  28. 'BusinessFieldId',
  29. 'MaterialCode',
  30. 'FirstClassId',
  31. 'SecondClassId',
  32. 'ThirdClassId',
  33. 'Name',
  34. 'Standard',
  35. 'FmsMaterialCodeClass/Name',
  36. 'FmsMaterialCodeClass1/Name',
  37. 'FmsMaterialCodeClass2/Name',
  38. 'FmsMaterialCodeClass/Abbreviation',
  39. 'FmsMaterialCodeClass1/Abbreviation',
  40. 'FmsMaterialCodeClass2/Abbreviation',
  41. 'Note',
  42. ],
  43. expand: ['FmsMaterialCodeClass', 'FmsMaterialCodeClass1', 'FmsMaterialCodeClass2']
  44. }
  45. }, 'FmsMaterial');
  46. var materialClasses2 = ko.observableArray(), materialClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
  47. businessFields = ko.observableArray(),
  48. materialTypes = ko.observableArray(),
  49. tradeCompanies = ko.observableArray(),
  50. warehouses = ko.observableArray(),
  51. locations = ko.observableArray(),
  52. materialCodes = ko.observableArray();
  53. var materialClassesForSearch = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
  54. materialTypesForSearch = ko.observableArray(),
  55. materialClassValuesForSearch = [ko.observable(), ko.observable(), ko.observable()],
  56. businessFieldsForSearch = ko.observableArray(),
  57. materialTypeIdForSearch = ko.observable(),
  58. businessFieldIdForSearch = ko.observable();
  59. var imagefileUrl = ko.observable(), uploadedFileInfo = {}, dropZone = null;
  60. var deferredForSearch = new $.Deferred();
  61. var defaultSearchClassArray = $SearchView.createDefaultArray('MaterialClassId');
  62. function handleFirstClassChangedValueInSearchView(e) {
  63. if (e.value === 0) {
  64. initializeSearchClasses();
  65. return;
  66. }
  67. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', e.value, materialClassesForSearch[1], defaultSearchClassArray);
  68. };
  69. function handleSecondClassChangedValueInSearchView(e) {
  70. if (e.value === 0) {
  71. initializeSearchClasses(true);
  72. return;
  73. }
  74. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', e.value, materialClassesForSearch[2], defaultSearchClassArray);
  75. };
  76. function initializeSearchClasses(onlyThird) {
  77. if (onlyThird === undefined || onlyThird === false) {
  78. materialClassesForSearch[1](defaultSearchClassArray.slice(0));
  79. materialClassValuesForSearch[1](0);
  80. }
  81. materialClassesForSearch[2](defaultSearchClassArray.slice(0));
  82. materialClassValuesForSearch[2](0);
  83. }
  84. function setupDropZone(isEditModeInPopup, dataViewModel) {//2019-10-14 변경
  85. var timer = null;
  86. isEditModeInPopup.subscribe(function (value) {
  87. if (value) {
  88. if (timer) {
  89. clearInterval(timer);
  90. }
  91. timer = setInterval(function () {
  92. if ($('#materialDropZone').length) {
  93. if (_.isNull(dropZone)) {
  94. dropZone = BWA.DropZone.create({
  95. id: '#materialDropZone',
  96. categoryId: $Code.FileCategory.MATERIAL,
  97. uploadedFileInfo: uploadedFileInfo,
  98. handleRemoveBeforePromise: function () {
  99. var keys = BWA.db.extractKeysObject('FmsMaterial', dataViewModel);
  100. return BWA.db.FmsMaterial.update(keys, { ImageFileId: null });
  101. },
  102. handleSuccess: function (fileInfo) {
  103. if (uploadedFileInfo.FileId) {
  104. dataViewModel.ImageFileId(uploadedFileInfo.FileId);
  105. var keys = BWA.db.extractKeysObject('FmsMaterial', dataViewModel);
  106. if (keys.MaterialId != null) {
  107. return BWA.db.FmsMaterial.update(keys, { ImageFileId: uploadedFileInfo.FileId });
  108. }
  109. }
  110. },
  111. handleRemovedFile: function () {
  112. dataViewModel.ImageFileId(null);
  113. }
  114. });
  115. }
  116. }
  117. }, 100);
  118. }
  119. else {
  120. if (timer) {
  121. clearInterval(timer);
  122. timer = null;
  123. }
  124. dropZone = null;
  125. }
  126. });
  127. }
  128. var materialFactory = BemsWebApplication.Factory.Material;
  129. var materialFactorydataSourceOptions = materialFactory.getDataSourceForDataGrid(); // 2016 05 10 추가 hcLee
  130. materialFactorydataSourceOptions.filter = []; // 2016 05 10 추가 hcLee
  131. var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsMaterial', {
  132. dataSourceOptions: materialFactorydataSourceOptions, // 2016 05 10 추가 hcLee
  133. columns: materialFactory.defaultColumns,
  134. paging: {
  135. pageSize: 18,
  136. enabled: true
  137. },
  138. pager:{},
  139. "export": {
  140. enabled: true,
  141. fileName: '자재 목록',
  142. },
  143. onExporting: function (e) {
  144. e.component.columnOption("MaterialId", "visible", false);
  145. },
  146. onExported: function (e) {
  147. e.component.columnOption("MaterialId", "visible", true);
  148. },
  149. popupWidth: '700px',
  150. wordWrapEnabled: true,
  151. cellPrepared: materialFactory.cellPrepared,
  152. searchViewItems: [
  153. { id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: materialClassValuesForSearch[0], dataSource: materialClassesForSearch[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
  154. { id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[1], dataSource: materialClassesForSearch[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
  155. { id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: materialClassValuesForSearch[2], dataSource: materialClassesForSearch[2] },
  156. { id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, dataSource: businessFieldsForSearch },
  157. { id: 'Name' },
  158. { id: 'Standard' },
  159. { id: 'Manufecturer' },
  160. { id: 'IsDiscontinued' },
  161. { id: 'IsUse', ignoreValue: 0, defaultValue: true, isChecked: false }
  162. ],
  163. promiseDataInSearchView: deferredForSearch.promise(),
  164. handleViewShowing: function () {
  165. MaterialCodeClassDataSource.filter([
  166. ['SiteId', '=', BWA.UserInfo.SiteId()]
  167. ]);
  168. $.when(
  169. MaterialCodeClassDataSource.load()
  170. ).done(function (Result) {
  171. materialClass = ko.observableArray();
  172. var cnt = 0;
  173. for (var i = 0; i < Result.length; i++) {
  174. materialClass.push(Result[i]);
  175. }
  176. materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
  177. });
  178. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
  179. materialFactorydataSourceOptions.filter.splice(0, materialFactorydataSourceOptions.filter.length);
  180. materialFactorydataSourceOptions.filter.push([eq('SiteId', BWA.UserInfo.SiteId())]);
  181. if (useBusinessFiltering) {
  182. materialFactorydataSourceOptions.filter.push('and');
  183. materialFactorydataSourceOptions.filter.push([eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'and', ['BusinessFieldId', '<>', 1]]);
  184. materialCodesDataSource.filter([
  185. eq('SiteId', BWA.UserInfo.SiteId()),
  186. 'and',
  187. [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'and', ['BusinessFieldId', '<>', 1]] // 2016 05 02 hcLee
  188. ]);
  189. businessFieldDataSource.filter([
  190. eq('SiteId', BWA.UserInfo.SiteId()),
  191. 'and',
  192. ['BusinessFieldId', '=', BWA.UserInfo.BusinessFieldId()],
  193. 'and',
  194. ['BusinessFieldId', '<>', 1]
  195. ]);
  196. }
  197. else {
  198. materialFactorydataSourceOptions.filter.push('and');
  199. materialFactorydataSourceOptions.filter.push(['BusinessFieldId', '<>', 1]);
  200. materialCodesDataSource.filter([
  201. ['SiteId', '=', BWA.UserInfo.SiteId()],
  202. 'and',
  203. ['BusinessFieldId', '<>', 1] // 2016 05 02 hcLee
  204. ]);
  205. businessFieldDataSource.filter([
  206. eq('SiteId', BWA.UserInfo.SiteId()),
  207. 'and',
  208. ['BusinessFieldId', '<>', 1],
  209. ]);
  210. }
  211. materialClassDataSource.filter([
  212. ['SiteId', '=', BWA.UserInfo.SiteId()],
  213. 'and',
  214. ['ParentMaterialClassId', '=', null]
  215. ]);
  216. $.when(
  217. businessFieldDataSource.load(),
  218. materialClassDataSource.load(),
  219. materialTypeDataSource.load(),
  220. tradeCompanyDataSource.load(),
  221. warehouseDataSource.load(),
  222. locationDataSource.load(),
  223. materialCodesDataSource.load()
  224. ).done(function (dbBusinessFields, dbMaterialClasses, dbMaterialTypes,
  225. dbTradeCompanies, dbWarehouses, dbLocations, dbMaterialCodes) {
  226. dbBusinessFields = dbBusinessFields[0];
  227. dbMaterialClasses = dbMaterialClasses[0];
  228. dbMaterialTypes = dbMaterialTypes[0];
  229. dbTradeCompanies = dbTradeCompanies[0];
  230. dbWarehouses = dbWarehouses[0];
  231. dbLocations = dbLocations[0];
  232. materialClasses[0](dbMaterialClasses);
  233. materialClassesForSearch[0]($SearchView.createArrayOfSelectBox('MaterialClassId', dbMaterialClasses));
  234. initializeSearchClasses();
  235. businessFields(dbBusinessFields);
  236. materialTypes(dbMaterialTypes);
  237. tradeCompanies(dbTradeCompanies);
  238. warehouses(dbWarehouses);
  239. locations(dbLocations);
  240. businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', dbBusinessFields));
  241. materialTypesForSearch($SearchView.createArrayOfSelectBox('MaterialTypeId', dbMaterialTypes));
  242. materialCodes(dbMaterialCodes[0]);
  243. deferredForSearch.resolve();
  244. });
  245. materialClassDataSource2.filter([
  246. ['SiteId', '=', BWA.UserInfo.SiteId()],
  247. ]);
  248. $.when(
  249. materialClassDataSource2.load()
  250. ).done(function (dbMaterialClasses2) {
  251. materialClasses2(dbMaterialClasses2);
  252. });
  253. },
  254. handleViewShown: function (dataViewModel, isEditModeInPopup) {
  255. setupDropZone(isEditModeInPopup, dataViewModel);
  256. },
  257. handlePopupShowing: function (isEditMode, isNew, dataViewModel) {
  258. imagefileUrl(undefined);
  259. if (_.isNull(dropZone) === false) dropZone.resetUploadedFileInfo();
  260. if (isNew) { // 신규등록인 경우
  261. dropZone = null;
  262. }
  263. FmsMaterialDataSource.filter([
  264. ["SiteId", "=", BWA.UserInfo.SiteId()]
  265. ]);
  266. FmsMaterialDataSource.load().done(function (result) {
  267. MaterialInfo(result);
  268. });
  269. },
  270. handlePopupShown: function (isEditMode, isNew, dataViewModel) {
  271. isEditModeInPopup(false);
  272. if (isNew) {
  273. isEditModeInPopup(true);
  274. dataViewModel.FinalStockCount(0);
  275. dataViewModel.FinalTotalStockAmount(0);
  276. }
  277. },
  278. handleCancelInPopup: function () {
  279. isEditModeInPopup(false);
  280. },
  281. handlePopupButtonClose: function () {
  282. isEditModeInPopup(false);
  283. },
  284. handlePopupButtonEdit: function (dataModel) {
  285. isEditModeInPopup(true);
  286. },
  287. handleSaveSuccess: function () {
  288. if (_.isNull(dropZone) === false) {
  289. dropZone.resetUploadedFileInfo();
  290. }
  291. isEditModeInPopup(false);
  292. },
  293. beforeInsertingDataViewModel: function (dataModel, dbModelId) {
  294. var dfd = $.Deferred();
  295. var isDuplicated = false;
  296. var PopMaterialName = $("#materialName").dxTextBox('instance').option('value');
  297. var PopMaterialType = $("#materialType").dxSelectBox('instance').option('value');
  298. var PopBusinessField = $("#businessField").dxSelectBox('instance').option('value');
  299. var PopmaterialClass = $("#materialClass").dxSelectBox('instance').option('value');
  300. for (var i = 0; i < MaterialInfo().length; i++) {
  301. if (dataModel.Name() == MaterialInfo()[i].Name() && dataModel.BusinessFieldId() == MaterialInfo()[i].BusinessFieldId()) {
  302. isDuplicated = true;
  303. }
  304. }
  305. if (!BWA.DataUtil.isValidInputValue(dataModel.Name()) || PopMaterialType == null || PopBusinessField == null || PopmaterialClass == null)
  306. return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');
  307. else {
  308. if (isDuplicated)
  309. return dfd.resolve(false, '이미 동일 정보가 존재합니다.');
  310. else
  311. return dfd.resolve(true);
  312. }
  313. },
  314. beforeUpdateDataViewModel: function () {
  315. var dataModel = viewModel.dataModel;
  316. var PopMaterialName = $("#materialName").dxTextBox('instance').option('value');
  317. var PopMaterialType = $("#materialType").dxSelectBox('instance').option('value');
  318. var PopBusinessField = $("#businessField").dxSelectBox('instance').option('value');
  319. var PopmaterialClass = $("#materialClass").dxSelectBox('instance').option('value');
  320. var isDuplicated = false;
  321. for (var i = 0; i < MaterialInfo().length; i++) {
  322. if (viewModel.dataModel.Name() == MaterialInfo()[i].Name() && viewModel.dataModel.BusinessFieldId() == MaterialInfo()[i].BusinessFieldId()
  323. && (RowName() != MaterialInfo()[i].Name() || RowBusinessFieldId() != MaterialInfo()[i].BusinessFieldId())) {
  324. isDuplicated = true;
  325. break;
  326. }
  327. }
  328. if (!BWA.DataUtil.isValidInputValue(dataModel.Name()) || PopMaterialType == null || PopBusinessField == null || PopmaterialClass == null) {
  329. utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
  330. return 0;
  331. }
  332. else {
  333. if (isDuplicated) {
  334. utils.toast.show('이미 동일 정보가 존재합니다.', 'error');
  335. return 0;
  336. }
  337. else
  338. return 2;
  339. }
  340. },
  341. handleAfterSaveInPopup: function (responseKey, response) {//2019-10-14 변경
  342. viewModel.dataModel.MaterialId(responseKey.MaterialId);
  343. materialCodesDataSource.load().done(function (dbMaterialCodes) {
  344. materialCodes(dbMaterialCodes);
  345. });
  346. },
  347. handleSaveButtonInPopup: function (isInsert) {//2019-10-14 변경
  348. if (isInsert === false) {//추가, 변경 여부
  349. if (_.isNull(dropZone) === false) {
  350. if (viewModel.dataModel.ImageFileId() != null) { //변경 - 그림삭제
  351. var temp = {
  352. SiteId: BWA.UserInfo.SiteId(),
  353. FileId: viewModel.dataModel.ImageFileId()
  354. }
  355. BWA.db.CmFile.byKey(temp).done(function (data) {
  356. dropZone.removeFile(data);
  357. dropZone.processQueue();
  358. });
  359. }
  360. else {
  361. dropZone.processQueue();//변경 - 그림 삭제 필요없음
  362. }
  363. }
  364. }
  365. else {
  366. if (_.isNull(dropZone) === false) { //추가
  367. if (viewModel.dataModel.ImageFileId() == null) {
  368. dropZone.processQueue();
  369. }
  370. }
  371. }
  372. },
  373. handleBeforeDelete: function () {//2019-10-14 변경
  374. var temp = {
  375. SiteId: BWA.UserInfo.SiteId(),
  376. FileId: viewModel.dataModel.ImageFileId()
  377. }
  378. BWA.db.CmFile.byKey(temp).done(function (data) {
  379. if ($('#materialDropZone1').length) {
  380. if (_.isNull(dropZone)) {
  381. dropZone = BWA.DropZone.create({
  382. id: '#materialDropZone1',
  383. categoryId: $Code.FileCategory.MATERIAL
  384. });
  385. if (viewModel.dataModel.ImageFileId() != null)
  386. dropZone.removeFile(data);
  387. console.log('here');
  388. dropZone = null;
  389. }
  390. }
  391. });
  392. },
  393. handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {
  394. if (isNewInPopup() == false) {
  395. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', dataViewModel.FirstClassId(), materialClasses[1]).done(function () {
  396. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', dataViewModel.SecondClassId(), materialClasses[2]);
  397. });
  398. BWA.DataUtil.setArrayDataSourceFilter(warehouseDataSource, 'BusinessFieldId', dataViewModel.BusinessFieldId(), warehouses);
  399. if (_.isNull(dataViewModel.ImageFileId()) === false) {
  400. imagefileUrl('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, dataViewModel.SiteId(), dataViewModel.ImageFileId()));
  401. }
  402. else {
  403. imagefileUrl("images/default.png");
  404. }
  405. }
  406. },
  407. handleAfterDelete: function () {
  408. materialCodesDataSource.load().done(function (dbMaterialCodes) {
  409. materialCodes(dbMaterialCodes);
  410. });
  411. },
  412. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  413. dataGrid.clearSelection();
  414. viewModel.isNewInPopup(false); //
  415. var data = clickRow.data;
  416. var dataModel = viewModel.dataModel;
  417. RowName = data.Name;
  418. RowBusinessFieldId = data.BusinessFieldId;
  419. RowMaterialTypeId = data.MaterialTypeId;
  420. if (data.SecondClassId() != null) {
  421. data.SecondClassName(data['SecondClassName']());
  422. }
  423. if (data.ThirdClassId() != null) {
  424. data.ThirdClassName(data['ThirdClassName']());
  425. }
  426. dataModel.ClassName = $KoSet(dataModel.ClassName, materialFactory.formatClassName(data.FirstClassName(), data.SecondClassName(), data.ThirdClassName()));
  427. dataModel.MaterialTypeName = $KoSet(dataModel.MaterialTypeName, data['FmsMaterialCodeType/Name']);
  428. dataModel.BusinessFieldName = $KoSet(dataModel.BusinessFieldName, data['CmBusinessField/Name']);
  429. dataModel.WarehouseName = $KoSet(dataModel.WarehouseName, data['FmsMaterialWarehouse/Name']);
  430. dataModel.TradeCompanyName = $KoSet(dataModel.TradeCompanyName, data['FmsMaterialTradeCompany/Name']);
  431. dataModel.LocationName = $KoSet(dataModel.LocationName, data['FmsMaterialCodeLocation/Name']);
  432. // hcLee 2016 01 15
  433. dataModel.Note = $KoSet(dataModel.Note, data['Note']);
  434. dataModel.MaterialId(data.MaterialId());//2019-10-14 변경
  435. popupVisible(true);
  436. }
  437. });
  438. viewModel.handleSelectBoxChangeBusinessField = function (e) {
  439. BWA.DataUtil.setArrayDataSourceFilter(warehouseDataSource, 'BusinessFieldId', e.value, warehouses);
  440. viewModel.dataModel.WarehouseId(null);
  441. }
  442. viewModel.handleSelectBoxChangeFirstClass = function (e) {
  443. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', e.value, materialClasses[1]);
  444. viewModel.dataModel.SecondClassId(null);
  445. viewModel.dataModel.ThirdClassId(null);
  446. if (e.value != null) {
  447. var iniCodeName = e.selectedItem.Abbreviation();
  448. userMaterialCode1st(iniCodeName);
  449. userMaterialCode2nd('');
  450. userMaterialCode3rd('');
  451. viewModel.dataModel.MaterialCode(userMaterialCode1st());
  452. }
  453. }
  454. viewModel.handleSelectBoxChangeSecondClass = function (e) {
  455. BWA.DataUtil.setArrayDataSourceFilter(materialClassDataSource, 'ParentMaterialClassId', e.value, materialClasses[2]);
  456. viewModel.dataModel.ThirdClassId(null);
  457. if (e.value != null) {
  458. if (e.selectedItem != null) {
  459. var iniCodeName = e.selectedItem.Abbreviation();
  460. userMaterialCode2nd(iniCodeName);
  461. viewModel.dataModel.MaterialCode(userMaterialCode1st() + '-' + userMaterialCode2nd());
  462. }
  463. }
  464. }
  465. viewModel.handleSelectBoxChangeThirdClass = function (e) {
  466. if (e.value != null) {
  467. if (e.selectedItem != null) {
  468. var iniCodeName = e.selectedItem.Abbreviation();
  469. userMaterialCode3rd(iniCodeName);
  470. viewModel.dataModel.MaterialCode(userMaterialCode1st() + '-' + userMaterialCode2nd() + '-' + userMaterialCode3rd());
  471. }
  472. }
  473. }
  474. function MaterialImport() {
  475. var inputFileControl = document.getElementById("FILE_IMPORT");
  476. $(document).ready(function () {
  477. function changeValue(e) {
  478. if (e.currentTarget.value == "") {
  479. }
  480. else if (!checkFileType(e.currentTarget.value)) {
  481. utils.toast.show('정해진 양식으로만 올려주세요!', 'error');
  482. return;
  483. } else {
  484. var files = e.target.files; //input file 객체를 가져온다.
  485. var i, f;
  486. for (i = 0; i != files.length; ++i) {
  487. f = files[i];
  488. var reader = new FileReader(); //FileReader를 생성한다.
  489. //성공적으로 읽기 동작이 완료된 경우 실행되는 이벤트 핸들러를 설정한다.
  490. reader.onload = function (e) {
  491. if (e) {
  492. var data = e.target.result;
  493. data = new Uint8Array(data);
  494. var EXCELarray = [];
  495. var tempEXCELarray = [];
  496. var workbook = XLSX.read(data, { type: 'array' });
  497. workbook.SheetNames.forEach(function (item, index, array) {
  498. EXCELarray.push(XLSX.utils.sheet_to_json(workbook.Sheets[item]));
  499. });
  500. for (var i = 0; i < EXCELarray[0].length; i++) {
  501. var tempmaterial = {
  502. SiteId: BWA.UserInfo.SiteId(),
  503. BusinessFieldId: EXCELarray[0][i]['업무분야(*)'],
  504. MaterialId: null,
  505. MaterialCode: null,
  506. Name: EXCELarray[0][i]['자재명(*)'],
  507. FirstClassId: EXCELarray[0][i]['자재 대분류(*)'],
  508. SecondClassId: EXCELarray[0][i]['자재 중분류'],
  509. ThirdClassId: EXCELarray[0][i]['자재 소분류'],
  510. LocationId: null,
  511. MaterialTypeId: EXCELarray[0][i]['자재구분(*)'],
  512. TradeCompanyId: null,
  513. WarehouseId: null,
  514. Rfid: EXCELarray[0][i]['RFID'],
  515. Unit: EXCELarray[0][i]['단위'],
  516. DurableYears: EXCELarray[0][i]['내용연수'],
  517. ReasonableStockCount: EXCELarray[0][i]['적정재고량'],
  518. Manufacturer: EXCELarray[0][i]['제조사'],
  519. Standard: EXCELarray[0][i]['규격'],
  520. FinalPrice: EXCELarray[0][i]['단가'],
  521. ImageFileId: null,
  522. Note: EXCELarray[0][i]['비고'],
  523. IsDiscontinued: EXCELarray[0][i]['단종여부(*)[예 or 아니오]'],
  524. IsUse: EXCELarray[0][i]['사용여부(*)[사용 or 미사용]'],
  525. FinalStockCount: 0,
  526. FinalTotalStockAmount: 0,
  527. }
  528. // 업무분야
  529. if (tempmaterial.BusinessFieldId == null) {
  530. utils.toast.show('업무 분야를 입력해야합니다(' + (i + 1) + '번 행)', 'error');
  531. return;
  532. }
  533. else {
  534. var cnt = 0;
  535. for (var j = 0; j < businessFields().length; j++) {
  536. if (tempmaterial.BusinessFieldId == businessFields()[j].Name()) {
  537. tempmaterial.BusinessFieldId = businessFields()[j].BusinessFieldId();
  538. break;
  539. }
  540. else {
  541. cnt++;
  542. if (cnt == businessFields().length) {
  543. utils.toast.show('잘못된 업무 분야 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
  544. return;
  545. }
  546. }
  547. }
  548. }
  549. // 자재명
  550. if (tempmaterial.Name == null) {
  551. utils.toast.show('자재명을 입력해야합니다(' + (i + 1) + '번 행)', 'error');
  552. return;
  553. }
  554. else {
  555. if (tempmaterial.Standard != null)
  556. tempmaterial.Standard = tempmaterial.Standard.toString();
  557. for (var j = 0; j < materialCodes().length; j++) {
  558. if (tempmaterial.Name == materialCodes()[j].Name()) {
  559. if (tempmaterial.Standard != null) {
  560. tempmaterial.Standard = tempmaterial.Standard.toString();
  561. if (tempmaterial.Standard == materialCodes()[j].Standard()) {
  562. utils.toast.show('동일한 자매명과 규격을 입력할수 없습니다(' + (i + 1) + '번 행)', 'error');
  563. return;
  564. }
  565. }
  566. else {
  567. if (materialCodes()[j].Standard() == null) {
  568. utils.toast.show('동일한 자매명과 규격을 입력할수 없습니다(' + (i + 1) + '번 행)', 'error');
  569. return;
  570. }
  571. }
  572. }
  573. }
  574. }
  575. //자재구분
  576. if (tempmaterial.MaterialTypeId == null) {
  577. utils.toast.show('자재 구분을 입력해야합니다(' + (i + 1) + '번 행)', 'error');
  578. return;
  579. }
  580. else {
  581. var cnt = 0;
  582. for (var j = 0; j < materialTypes().length; j++) {
  583. if (tempmaterial.MaterialTypeId == materialTypes()[j].Name()) {
  584. tempmaterial.MaterialTypeId = materialTypes()[j].MaterialTypeId();
  585. break;
  586. }
  587. else {
  588. cnt++;
  589. if (cnt == materialTypes().length) {
  590. utils.toast.show('잘못된 자재 구분 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
  591. return;
  592. }
  593. }
  594. }
  595. }
  596. //단종여부
  597. if (tempmaterial.IsDiscontinued == null) {
  598. utils.toast.show('단종여부를 입력해야합니다(' + (i + 1) + '번 행)[예 or 아니오]', 'error');
  599. return;
  600. }
  601. else {
  602. if (tempmaterial.IsDiscontinued == "예") {
  603. tempmaterial.IsDiscontinued = true;
  604. } else if (tempmaterial.IsDiscontinued == "아니오") {
  605. tempmaterial.IsDiscontinued = false;
  606. }
  607. else {
  608. utils.toast.show('단종여부를 정확히 입력해야합니다(' + (i + 1) + '번 행)[사용 or 미사용]', 'error');
  609. return;
  610. }
  611. }
  612. //사용여부
  613. if (tempmaterial.IsUse == null) {
  614. utils.toast.show('사용여부를 입력해야합니다(' + (i + 1) + '번 행)[사용 or 미사용]', 'error');
  615. return;
  616. }
  617. else {
  618. if (tempmaterial.IsUse == "사용") {
  619. tempmaterial.IsUse = true;
  620. } else if (tempmaterial.IsUse == "미사용") {
  621. tempmaterial.IsUse = false;
  622. }
  623. else {
  624. utils.toast.show('사용여부를 정확히 입력해야합니다(' + (i + 1) + '번 행)[사용 or 미사용]', 'error');
  625. return;
  626. }
  627. }
  628. //자재 대분류
  629. if (tempmaterial.FirstClassId == null) {
  630. utils.toast.show('자재 대분류를 입력해야합니다(' + (i + 1) + '번 행)', 'error');
  631. return;
  632. }
  633. else {
  634. var cnt = 0;
  635. for (var j = 0; j < materialClasses2().length; j++) {
  636. if ((tempmaterial.FirstClassId == materialClasses2()[j].Name()) && materialClasses2()[j].Depth() == 0) {
  637. tempmaterial.MaterialCode = tempmaterial.FirstClassId;
  638. tempmaterial.FirstClassId = materialClasses2()[j].MaterialClassId();
  639. break;
  640. }
  641. else {
  642. cnt++;
  643. if (cnt == materialClasses2().length) {
  644. utils.toast.show('잘못된 자재 대분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
  645. return;
  646. }
  647. }
  648. }
  649. }
  650. //자재 중분류
  651. if (tempmaterial.SecondClassId != null) {
  652. var cnt = 0;
  653. for (var j = 0; j < materialClasses2().length; j++) {
  654. if ((tempmaterial.SecondClassId == materialClasses2()[j].Name()) && (tempmaterial.FirstClassId == materialClasses2()[j].ParentMaterialClassId()) && (materialClasses2()[j].Depth() == 1)) {
  655. tempmaterial.MaterialCode = tempmaterial.MaterialCode + "-" + tempmaterial.SecondClassId;
  656. tempmaterial.SecondClassId = materialClasses2()[j].MaterialClassId();
  657. break;
  658. }
  659. else {
  660. cnt++;
  661. if (cnt == materialClasses2().length) {
  662. utils.toast.show('잘못된 자재 중분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
  663. return;
  664. }
  665. }
  666. }
  667. }
  668. //자재 소분류
  669. if (tempmaterial.ThirdClassId != null) {
  670. var cnt = 0;
  671. for (var j = 0; j < materialClasses2().length; j++) {
  672. if ((tempmaterial.ThirdClassId == materialClasses2()[j].Name()) && (tempmaterial.SecondClassId == materialClasses2()[j].ParentMaterialClassId()) && (materialClasses2()[j].Depth() == 2)) {
  673. tempmaterial.MaterialCode = tempmaterial.MaterialCode + "-" + tempmaterial.ThirdClassId;
  674. tempmaterial.ThirdClassId = materialClasses2()[j].MaterialClassId();
  675. break;
  676. }
  677. else {
  678. cnt++;
  679. if (cnt == materialClasses2().length) {
  680. utils.toast.show('잘못된 자재 소분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
  681. return;
  682. }
  683. }
  684. }
  685. }
  686. if (tempmaterial.Name != null)
  687. tempmaterial.Name = tempmaterial.Name.toString();
  688. if (tempmaterial.Rfid != null)
  689. tempmaterial.Rfid = tempmaterial.Rfid.toString();
  690. if (tempmaterial.Unit != null)
  691. tempmaterial.Unit = tempmaterial.Unit.toString();
  692. if (tempmaterial.DurableYears != null) {
  693. if (typeof (tempmaterial.DurableYears) == "string") {
  694. utils.toast.show('내용연수는 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
  695. return;
  696. }
  697. else {
  698. tempmaterial.DurableYears = parseInt(tempmaterial.DurableYears);
  699. }
  700. }
  701. if (tempmaterial.ReasonableStockCount != null) {
  702. if (typeof (tempmaterial.ReasonableStockCount) == "string") {
  703. utils.toast.show('적정재고량은 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
  704. return;
  705. }
  706. else {
  707. tempmaterial.ReasonableStockCount = parseInt(tempmaterial.ReasonableStockCount);
  708. }
  709. }
  710. if (tempmaterial.FinalPrice != null) {
  711. if (typeof (tempmaterial.FinalPrice) == "string") {
  712. utils.toast.show('단가는 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
  713. return;
  714. }
  715. else {
  716. tempmaterial.FinalPrice = parseInt(tempmaterial.FinalPrice);
  717. }
  718. }
  719. if (tempmaterial.Manufacturer != null)
  720. tempmaterial.Manufacturer = tempmaterial.Manufacturer.toString();
  721. if (tempmaterial.Note != null)
  722. tempmaterial.Note = tempmaterial.Note.toString();
  723. tempEXCELarray.push(tempmaterial);
  724. }
  725. for (var k = 0; k < tempEXCELarray.length; k++) {
  726. BWA.db.FmsMaterial.insert(tempEXCELarray[k]).done(function (response, responseKey) {
  727. if (k == tempEXCELarray.length) {
  728. materialCodesDataSource.load().done(function (dbMaterialCodes) {
  729. materialCodes(dbMaterialCodes);
  730. utils.toast.show($G('successDatabaseInsertionMsg'));
  731. $('#gridContainer').dxDataGrid('instance').refresh();
  732. });
  733. }
  734. }).fail(function (error) {
  735. utils.toast.show(error);
  736. });
  737. }
  738. }
  739. };
  740. //파일객체를 읽는다. 완료되면 원시 이진 데이터가 문자열로 포함됨.
  741. reader.readAsArrayBuffer(f);
  742. }//end. for
  743. }
  744. $("#FILE_IMPORT").val("");
  745. }
  746. $("#FILE_IMPORT").on("change", changeValue);
  747. });
  748. inputFileControl.click();
  749. }
  750. function checkFileType(filePath) {
  751. var fileLen = filePath.length;
  752. var lastDot = filePath.lastIndexOf('.');
  753. var fileFormat = filePath.substring(lastDot, fileLen).toLowerCase();
  754. if (fileFormat == ".xls" || fileFormat == ".xlsx") {
  755. return true;
  756. } else { return false; }
  757. }
  758. function MaterialDownload() {
  759. var url = "";
  760. if (BemsWebApplication.config.mode == "production") {
  761. url = BemsWebApplication.config.endpoints.service.production + filePath;
  762. } else {
  763. url = BemsWebApplication.config.endpoints.service.local + filePath;
  764. }
  765. window.location.assign(url);
  766. }
  767. viewModel.dataModel.ClassName = ko.observable();
  768. viewModel.materialClasses = materialClasses;
  769. viewModel.materialTypes = materialTypes;
  770. viewModel.tradeCompanies = tradeCompanies;
  771. viewModel.warehouses = warehouses;
  772. viewModel.locations = locations;
  773. viewModel.businessFields = businessFields;
  774. viewModel.isEditModeInPopup = isEditModeInPopup;
  775. // hcLee 2016 03 02
  776. viewModel.dataModel.ClassName = ko.observable();
  777. viewModel.dataModel.MaterialTypeName = ko.observable();
  778. viewModel.dataModel.BusinessFieldName = ko.observable();
  779. viewModel.dataModel.WarehouseName = ko.observable();
  780. viewModel.dataModel.TradeCompanyName = ko.observable();
  781. viewModel.dataModel.LocationName = ko.observable();
  782. // hcLee 2016 01 15
  783. viewModel.dataModel.Note = ko.observable();
  784. viewModel.MaterialImport = MaterialImport;
  785. viewModel.MaterialDownload = MaterialDownload;
  786. // hcLee 2015 12 16 hcLee !!!!!!
  787. viewModel.imagefileUrl = imagefileUrl;
  788. return viewModel;
  789. };