repository_glj.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. /**
  2. * Created by Tony on 2017/5/5.
  3. */
  4. var pageOprObj = {
  5. rationLibName : null,
  6. rationLibId: null,
  7. initPage : function(container) {
  8. var me = this, rationLibId = getQueryString("repository");//获取定额库参数
  9. me.rationLibId = rationLibId;
  10. //getRationLibName
  11. CommonAjax.post('/complementaryRation/api/getRationLibs', {ids: [rationLibId]}, function (rstData) {
  12. if(rstData.length > 0){
  13. me.rationLibName = rstData[0].dispName;
  14. let $rationName = $(`<div id='rationname' class='navbar-text'>${me.rationLibName}</div>`);
  15. $('.header-logo').after($rationName);
  16. repositoryGljObj.buildSheet(container);
  17. repositoryGljObj.getGljDistType(function () {
  18. repositoryGljObj.currentRepositoryId = parseInt(rationLibId);
  19. //引用的工料机库
  20. let gljLibID = rstData[0].gljLib;
  21. if(gljLibID && typeof gljLibID !== 'undefined'){
  22. repositoryGljObj.getGljTree(gljLibID, function () {
  23. repositoryGljObj.getGljItems(gljLibID);
  24. });
  25. }
  26. sheetCommonObj.shieldAllCells(repositoryGljObj.workBook.getSheet(0), repositoryGljObj.setting);
  27. });
  28. }
  29. });
  30. }
  31. }
  32. repositoryGljObj = {
  33. treeObj : null,
  34. workBook: null,
  35. gljCurTypeId: -1,
  36. currentRepositoryId: -1,
  37. currentCache: null,
  38. parentNodeIds: {},
  39. gljList: [],
  40. distTypeTree: null,//add
  41. setting: {
  42. header:[
  43. {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
  44. {headerName:"名称",headerWidth:260,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
  45. {headerName:"规格型号",headerWidth:260,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
  46. {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
  47. {headerName:"定额价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
  48. {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"}
  49. ],
  50. view:{
  51. comboBox:[
  52. {row:-1,col:3,rowCount:-1,colCount:1}
  53. ],
  54. lockedCells:[
  55. ]
  56. }
  57. },
  58. getComboData: function (gljDistType) {
  59. let me = this;
  60. let distType;
  61. let distTypeTree = {
  62. prefix : 'gljType',
  63. distTypes: {},
  64. comboDatas: [],
  65. distTypesArr: []
  66. };
  67. gljDistType.forEach(function (typeData) {
  68. let typeObj = {
  69. data: typeData,
  70. children: [],
  71. parent: null
  72. }
  73. distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
  74. distTypeTree.distTypesArr.push(typeObj);
  75. });
  76. gljDistType.forEach(function (typeData) {
  77. distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
  78. let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
  79. if(parent){
  80. distType.parent = parent;
  81. parent.children.push(distType);
  82. }
  83. });
  84. distTypeTree.distTypesArr.forEach(function (distTypeObj) {
  85. if(distTypeObj.data.fullName !== '材料'){
  86. distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
  87. }
  88. });
  89. return distTypeTree;
  90. },
  91. getGljDistType: function (callback) {
  92. let me = this;
  93. CommonAjax.post('api/getGljDistType', {}, function (rstData) {
  94. me.distTypeTree = me.getComboData(rstData);
  95. me.workBook.getSheet(0).getCell(-1, 5, GC.Spread.Sheets.SheetArea.viewport).value(me.distTypeTree.comboDatas[0].text);
  96. if(callback){
  97. callback();
  98. }
  99. });
  100. },
  101. getGljTree: function(gljLibId, callback) {
  102. var me = this;
  103. CommonAjax.post('api/getGljTree', {gljLibId: gljLibId}, function (rstData) {
  104. zTreeHelper.createTree(rstData, gljSetting, "repositoryTree", me);
  105. if (rstData && rstData.length > 0) {
  106. me.gljCurTypeId = rstData[0].ID;
  107. } else {
  108. gljTypeTreeOprObj.addRootNode();
  109. }
  110. callback();
  111. });
  112. },
  113. getGljItems: function(gljLibId) {
  114. var me = this;
  115. CommonAjax.post('api/getGljItems', {stdGljLibId: gljLibId}, function (rstData) {
  116. me.gljList = rstData.stdGljs.concat(rstData.complementaryGljs);
  117. me.workBook.getSheet(0).setRowCount(rstData.length);
  118. me.sortGlj();
  119. let rootNode = me.treeObj.getNodes()[0];
  120. if(rootNode && rootNode.isParent && rootNode.isFirstNode){
  121. me.treeObj.selectNode(rootNode);
  122. gljTypeTreeOprObj.onClick(null, 'repositoryTree', rootNode);
  123. }
  124. });
  125. },
  126. showGljItems: function(data, type) {
  127. var me = repositoryGljObj;
  128. if (me.workBook) {
  129. var cacheSection = [];
  130. var pArr = me.parentNodeIds["_pNodeId_" + type];
  131. for (var i = 0; i < data.length; i++) {
  132. if (pArr && pArr.indexOf(data[i].gljClass) >= 0) {
  133. cacheSection.push(data[i]);
  134. } else if (type == data[i].gljClass) {
  135. //data[i].gljDistType = me.distTypeTree.distTypes[me.distTypeTree.prefix + data[i].gljDistType].data.fullName;
  136. cacheSection.push(data[i]);
  137. }
  138. }
  139. sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
  140. sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
  141. cacheSection = null;
  142. }
  143. },
  144. buildSheet: function(container) {
  145. var me = repositoryGljObj;
  146. me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
  147. me.workBook.getSheet(0).options.isProtected = true;
  148. /* me.repositoryGljDelOpr();
  149. me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
  150. me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
  151. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
  152. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
  153. //me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
  154. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);*/
  155. },
  156. onEnterCell: function (sender, args) {
  157. let me = repositoryGljObj;
  158. me.cellRowIdx = args.row;
  159. let isHasData = false;
  160. if(me.addGljObj){
  161. for(let i=0; i<me.setting.header.length; i++){
  162. if(me.addGljObj[me.setting.header[i].dataCode]){
  163. isHasData = true;
  164. break;
  165. }
  166. }
  167. }
  168. if(isHasData){
  169. if(me.editingRowIdx !== me.cellRowIdx) {
  170. let isComple = true;
  171. let focusToCol;
  172. function getFocusToCol (me){
  173. if(!me.addGljObj[me.setting.header[0].dataCode]){
  174. $('#alertGljTxt').text('编号不能为空,是否取消增加人材机?');
  175. return 0;
  176. }
  177. else if(!me.addGljObj[me.setting.header[1].dataCode]){
  178. $('#alertGljTxt').text('名称不能为空,是否取消增加人材机?');
  179. return 1;
  180. }
  181. else if(!me.addGljObj[me.setting.header[5].dataCode]){
  182. $('#alertGljTxt').text('类型不能为空,是否取消增加人材机?');
  183. return 5;
  184. }
  185. else {
  186. return -1;
  187. }
  188. }
  189. focusToCol = getFocusToCol(me);
  190. if(focusToCol === -1){
  191. }
  192. else {
  193. $('#gljAlertBtn').click();
  194. //me.workBook.getSheet(0).options.isProtected = true;
  195. sheetCommonObj.lockAllCells(args.sheet);
  196. $('#aleCanceBtn').click(function () {
  197. // me.workBook.getSheet(0).options.isProtected = false;
  198. sheetCommonObj.unLockAllCells(args.sheet);
  199. sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
  200. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  201. });
  202. $('#gljAleClose').click(function () {
  203. // me.workBook.getSheet(0).options.isProtected = false;
  204. sheetCommonObj.unLockAllCells(args.sheet);
  205. sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
  206. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  207. });
  208. $('#aleConfBtn').click(function () {
  209. // me.workBook.getSheet(0).options.isProtected = false;
  210. sheetCommonObj.unLockAllCells(args.sheet);
  211. sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
  212. me.addGljObj = null;
  213. for(let col=0; col<me.setting.header.length; col++){
  214. let field = me.setting.header[col].dataCode;
  215. if(field === 'gljType'){
  216. me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(
  217. me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj[field]].data.fullName);
  218. }
  219. else{
  220. me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(me.currentEditingGlj[me.setting.header[col].dataCode]);
  221. }
  222. }
  223. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
  224. });
  225. }
  226. }
  227. }
  228. },
  229. onCellEditStart: function(sender, args) {
  230. var me = repositoryGljObj;
  231. var rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
  232. me.currentEditingGlj = rObj;
  233. me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
  234. var cacheSection = me.gljList;
  235. if (cacheSection) {
  236. for (var j = 0; j < cacheSection.length; j++) {
  237. if (cacheSection[j][me.setting.header[0].dataCode] && cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
  238. rObj["ID"] = cacheSection[j]["ID"];
  239. rObj.gljClass = cacheSection[j].gljClass;
  240. break;
  241. }
  242. }
  243. }
  244. },
  245. onCellEditEnd: function(sender, args) {
  246. var me = repositoryGljObj, rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
  247. updateArr = [], addArr = [], updateBasePrcArr = [];
  248. me.editingRowIdx = args.row;
  249. rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
  250. if (me.currentEditingGlj["ID"]) {
  251. rObj["ID"] = me.currentEditingGlj["ID"];
  252. rObj.gljClass = me.currentEditingGlj.gljClass;
  253. for(let col =0; col< me.setting.header.length; col++){
  254. if(me.currentEditingGlj[me.setting.header[col].dataCode] !== rObj[me.setting.header[col].dataCode]){
  255. me.addGljObj = rObj;
  256. if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[1].dataCode] && rObj[me.setting.header[5].dataCode]){
  257. updateArr.push(rObj);
  258. break;
  259. }
  260. }
  261. }
  262. if(me.currentEditingGlj.basePrice !== rObj.basePrice){
  263. //update basePrice of ration when editting basePrice of glj
  264. let gljType = -1;
  265. let gljTypeParent = me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj.gljType].parent;
  266. if(gljTypeParent && gljTypeParent.data.ID <=3){
  267. gljType = gljTypeParent.data.ID;
  268. }
  269. if(!gljTypeParent && me.currentEditingGlj.gljType <= 3){
  270. gljType = me.currentEditingGlj.gljType;
  271. }
  272. let gljBasePrcObj = {gljId: me.currentEditingGlj.ID, gljType: gljType, basePrice: rObj.basePrice};
  273. if(gljBasePrcObj.gljType !== -1){
  274. updateBasePrcArr.push(gljBasePrcObj);
  275. me.updateRationBasePrcRq(updateBasePrcArr);
  276. }
  277. }
  278. //update basePrice of ration when editting gljType of glj
  279. if(me.currentEditingGlj.gljType !== rObj.gljType){
  280. let gljTypeObj = {gljId: me.currentEditingGlj.ID, gljType: rObj.gljType, basePrice: rObj.basePrice};
  281. updateBasePrcArr.push(gljTypeObj);
  282. me.updateRationBasePrcRq(updateBasePrcArr);
  283. }
  284. } else {
  285. me.addGljObj = rObj;
  286. let isCanSav = true;
  287. if(!rObj[me.setting.header[0].dataCode] || !rObj[me.setting.header[1].dataCode] || !rObj[me.setting.header[5].dataCode]){
  288. isCanSav = false;
  289. }
  290. if(isCanSav){
  291. me.addGljObj = null;
  292. addArr.push(rObj);
  293. }
  294. }
  295. if(me.gljCurTypeId !== 1){
  296. rObj.gljClass = me.gljCurTypeId;
  297. }
  298. if(updateArr.length >0 || addArr.length >0){
  299. me.currentEditingGlj = null;
  300. //me.workBook.getSheet(0).setValue(11, 5, "人工");
  301. me.mixUpdateRequest(updateArr, addArr, []);
  302. }
  303. },
  304. repositoryGljDelOpr: function () {
  305. let me = repositoryGljObj;
  306. me.workBook.commandManager().register('repositoryGljDel', function () {
  307. let sheet = me.workBook.getSheet(0),
  308. updateArr = [], removeArr = [],
  309. tempRemoveArr= [],
  310. refGljCodes = [], //已被引用的工料机
  311. updateBasePrcArr = [],//删除基价单位后重新计算
  312. sels = sheet.getSelections(),
  313. cacheSection = me.currentCache;
  314. if(sels.length > 0 && cacheSection.length > 0){
  315. for(let i = 0; i < sels.length; i++){
  316. if(sels[i].colCount === me.setting.header.length){
  317. for(let j = 0; j < sels[i].rowCount; j++){
  318. if(sels[i].row + j < cacheSection.length){
  319. tempRemoveArr.push({ID: cacheSection[sels[i].row + j].ID, code: cacheSection[sels[i].row + j].code});
  320. }
  321. }
  322. }
  323. else{
  324. let maxCol = sels[i].col + sels[i].colCount - 1;
  325. if(sels[i].col >= 2 && maxCol <= 4){
  326. for(let j = 0; j < sels[i].rowCount; j++){
  327. if(sels[i].row + j < cacheSection.length){
  328. let updateObj = cacheSection[sels[i].row + j];
  329. for(let col = sels[i].col; col <= maxCol; col++){
  330. if(me.setting.header[col].dataCode === 'basePrice'){
  331. updateObj[me.setting.header[col].dataCode] = 0;
  332. updateBasePrcArr.push({gljId: updateObj.ID, gljType: updateObj.gljType, basePrice: 0});
  333. }
  334. else{
  335. updateObj[me.setting.header[col].dataCode] = '';
  336. }
  337. }
  338. updateArr.push(updateObj);
  339. }
  340. }
  341. }
  342. //编号、名称、类型不可为空
  343. else{
  344. if(sels[i].row < cacheSection.length){
  345. let text = '', cantNullStr =['编码', '名称', '类型'];
  346. for(let col = sels[i].col; col <= sels[i].col + sels[i].colCount -1; col++){
  347. if(cantNullStr.indexOf(me.setting.header[col].headerName) !== -1){
  348. text += me.setting.header[col].headerName + " ";
  349. }
  350. }
  351. $('#alertText').text(text + "不可为空!");
  352. $('#codeAlertBtn').click();
  353. sheet.options.isProtected = true;
  354. $('#codAleConfBtn').click(function () {
  355. sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
  356. });
  357. $('#codAleClose').click(function () {
  358. sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
  359. });
  360. }
  361. }
  362. }
  363. }
  364. //提取已被引用工料机
  365. if(tempRemoveArr.length > 0){
  366. for(let i = 0; i < tempRemoveArr.length; i++){
  367. if(me.rationGljIds.indexOf(tempRemoveArr[i].ID) !== -1){
  368. refGljCodes.push(tempRemoveArr[i].code);
  369. tempRemoveArr.splice(i--, 1);
  370. }
  371. else{
  372. removeArr.push(tempRemoveArr[i].ID);
  373. }
  374. }
  375. }
  376. //提示
  377. if(refGljCodes.length > 0){
  378. let alertText;
  379. if(refGljCodes.length > 3){
  380. alertText = "编号: " + refGljCodes[0]+" 、" + refGljCodes[1] + " 、" + refGljCodes[2] + "...等人材机已有定额引用,删除失败!";
  381. }
  382. else {
  383. let alertCode = " ";
  384. for(let i=0; i< refGljCodes.length; i++){
  385. alertCode += refGljCodes[i] + " 、";
  386. }
  387. alertText = "编号:" + alertCode + "工料机已有定额引用,删除失败!"
  388. }
  389. $('#alertText').text(alertText);
  390. $('#codeAlertBtn').click();
  391. sheet.options.isProtected = true;
  392. $('#codAleConfBtn').click(function () {
  393. sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
  394. if(removeArr.length > 0){
  395. me.mixUpdateRequest(updateArr, [], removeArr);
  396. }
  397. });
  398. $('#codAleClose').click(function () {
  399. sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
  400. me.mixUpdateRequest(updateArr, [], removeArr);
  401. });
  402. }
  403. else if(removeArr.length > 0 || updateArr.length > 0){
  404. me.mixUpdateRequest(updateArr, [], removeArr);
  405. if(updateBasePrcArr.length > 0){
  406. me.updateRationBasePrcRq(updateBasePrcArr);
  407. }
  408. }
  409. }
  410. });
  411. me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
  412. me.workBook.commandManager().setShortcutKey('repositoryGljDel', GC.Spread.Commands.Key.del, false, false, false, false);
  413. },
  414. validUpdateObj: function (pasteObj, rowIdx) {
  415. let rst = {}, backUpObj = {},
  416. me = repositoryGljObj,
  417. tempObj = me.currentCache[rowIdx],
  418. reCalBasePrc = false, isValid = true;
  419. //备份原始数据
  420. for(let atr in tempObj){
  421. backUpObj[atr] = tempObj[atr];
  422. }
  423. if(typeof pasteObj.code !== 'undefined'){
  424. if(pasteObj.code.trim().length !== 0){
  425. let isExist = false;
  426. for(let i = 0; i < me.gljList.length; i++){
  427. if(me.gljList[i].code === pasteObj.code){
  428. isExist = true;
  429. break;
  430. }
  431. }
  432. if(!isExist){
  433. tempObj.code = pasteObj.code;
  434. }
  435. else isValid = false;
  436. }
  437. else isValid = false;
  438. }
  439. if(typeof pasteObj.name !== 'undefined'){
  440. if(pasteObj.name.trim().length === 0) isValid = false;
  441. else tempObj.name = pasteObj.name;
  442. }
  443. if(typeof pasteObj.specs !== 'undefined'){
  444. tempObj.specs = pasteObj.specs;
  445. }
  446. if(typeof pasteObj.unit !== 'undefined'){
  447. tempObj.unit = pasteObj.unit;
  448. }
  449. if(typeof pasteObj.gljType !== 'undefined'){
  450. let isExsit = false;
  451. for(let i = 0; i < me.distTypeTree.comboDatas.length; i++){
  452. if(pasteObj.gljType === me.distTypeTree.comboDatas[i].text){
  453. isExsit = true;
  454. reCalBasePrc = true;
  455. tempObj.gljType = me.distTypeTree.comboDatas[i].value;
  456. tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
  457. }
  458. }
  459. if(!isExsit) isValid = false;
  460. }
  461. //
  462. pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) :
  463. me.currentCache[rowIdx].basePrice;
  464. if(pasteObj.basePrice !== me.currentCache[rowIdx].basePrice){
  465. reCalBasePrc = true;
  466. tempObj.basePrice = pasteObj.basePrice;
  467. }
  468. if(isValid){
  469. rst.updateGlj = tempObj;
  470. if(reCalBasePrc){
  471. //重新计算定额基价对象
  472. rst.updateBasePrc = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
  473. }
  474. }
  475. else {
  476. for(let attr in backUpObj){
  477. tempObj[attr] = backUpObj[attr];
  478. }
  479. }
  480. return rst;
  481. },
  482. //粘贴的数据是否是可添加的数据,只有含有编号,名称,类型才可添加
  483. isValidObj: function(pasteObj) {
  484. let me = repositoryGljObj;
  485. if(!(pasteObj.code && typeof pasteObj.code !== 'undefined') || !(pasteObj.name && typeof pasteObj.name !== 'undefined') ||
  486. !(pasteObj.gljType && typeof pasteObj.gljType !== 'undefined')){
  487. return false;
  488. }
  489. if(pasteObj.gljType && typeof pasteObj.gljType !== 'undefined'){
  490. let isExist = false;
  491. for(let i = 0; i < me.distTypeTree.comboDatas.length; i++){
  492. if(me.distTypeTree.comboDatas[i].text === pasteObj.gljType){
  493. isExist = true;
  494. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  495. pasteObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + pasteObj.gljType].data.shortName;
  496. break;
  497. }
  498. }
  499. if(!isExist){
  500. return false;
  501. }
  502. }
  503. if(pasteObj.code && typeof pasteObj.code !== 'undefined'){
  504. for(let i = 0; i < me.gljList.length; i++){
  505. if(me.gljList[i].code === pasteObj.code){
  506. return false;
  507. }
  508. }
  509. }
  510. pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
  511. pasteObj.gljClass = me.gljCurTypeId;
  512. return true;
  513. },
  514. onClipboardPasting: function(sender, args) {
  515. var me = repositoryGljObj;
  516. /*if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
  517. args.cancel = true;
  518. }*/
  519. if (me.gljCurTypeId < 0 ) {
  520. args.cancel = true;
  521. }
  522. },
  523. onClipboardPasted: function(e, info) {
  524. var me = repositoryGljObj;
  525. var updateArr = [], addArr = [];
  526. var items = sheetCommonObj.analyzePasteData(me.setting, info);
  527. let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
  528. maxRow = me.currentCache.length - 1, updateItems = [], addItems = [], updateBasePrcArr = [] , updateCount, resumeArr = [];
  529. if(endRow <= maxRow){
  530. //updateItems = items;
  531. for(let i = 0; i < items.length; i++){
  532. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  533. if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
  534. updateArr.push(updateObj.updateGlj);
  535. if(typeof updateObj.updateBasePrc !== 'undefined'){
  536. updateBasePrcArr.push(updateObj.updateBasePrc);
  537. }
  538. }
  539. else{
  540. resumeArr.push(info.cellRange.row + i);
  541. }
  542. }
  543. }
  544. else if(beginRow <= maxRow && endRow > maxRow){
  545. updateCount = maxRow - beginRow + 1;
  546. for(let i = 0; i < updateCount; i++){
  547. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  548. if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
  549. updateArr.push(updateObj.updateGlj);
  550. if(typeof updateObj.updateBasePrc !== 'undefined'){
  551. updateBasePrcArr.push(updateObj.updateBasePrc);
  552. }
  553. }
  554. else{
  555. resumeArr.push(info.cellRange.row + i);
  556. }
  557. }
  558. if(info.cellRange.colCount === me.setting.header.length){
  559. for(let i = updateCount ; i < items.length; i++){
  560. if(me.isValidObj(items[i])){
  561. addItems.push(items[i]);
  562. addArr.push(items[i]);
  563. }
  564. else{
  565. resumeArr.push(info.cellRange.row + i);
  566. }
  567. }
  568. }
  569. else{
  570. for(let i = updateCount ; i < items.length; i++){
  571. resumeArr.push(info.cellRange.row + i);
  572. }
  573. }
  574. }
  575. else{
  576. if(info.cellRange.colCount === me.setting.header.length){
  577. for(let i = 0; i < items.length; i++){
  578. if(me.isValidObj(items[i])){
  579. addArr.push(items[i]);
  580. }
  581. else{
  582. resumeArr.push(info.cellRange.row + i);
  583. }
  584. }
  585. }
  586. else{
  587. for(let i = 0; i < items.length; i++){
  588. resumeArr.push(info.cellRange.row + i);
  589. }
  590. }
  591. }
  592. //repaint
  593. if(resumeArr.length > 0){
  594. info.sheet.suspendPaint();
  595. for(let i = 0; i < resumeArr.length ; i++){
  596. if(resumeArr[i] < me.currentCache.length){
  597. for(let col = 0; col < me.setting.header.length; col++){
  598. if(me.setting.header[col].dataCode === 'gljType'){
  599. let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
  600. info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
  601. }
  602. else{
  603. info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
  604. }
  605. }
  606. }
  607. else{
  608. for(let col = 0; col < me.setting.header.length; col++){
  609. info.sheet.setValue(resumeArr[i], col, '');
  610. }
  611. }
  612. }
  613. info.sheet.resumePaint();
  614. }
  615. if (updateArr.length > 0 || addArr.length > 0) {
  616. me.mixUpdateRequest(updateArr, addArr, []);
  617. }
  618. if(updateBasePrcArr.length > 0){
  619. me.updateRationBasePrcRq(updateBasePrcArr);
  620. }
  621. },
  622. updateRationBasePrcRq: function (basePrcArr) {
  623. $.ajax({
  624. type: 'post',
  625. url: 'api/updateRationBasePrc',
  626. data:{data: JSON.stringify({repId: pageOprObj.rationLibId, lastOpr: userAccount, basePrcArr: basePrcArr})},
  627. dataType: 'json',
  628. success: function (result) {
  629. if(result.error){
  630. alert("计算定额基价失败");
  631. }
  632. }
  633. });
  634. },
  635. getRationGljIds: function (repId) {
  636. let me = repositoryGljObj;
  637. $.ajax({
  638. type: 'post',
  639. url: 'api/getRationGljIds',
  640. data: {data: JSON.stringify({repId: repId})},
  641. dataType: 'json',
  642. success: function(result){
  643. if(!result.error){
  644. me.rationGljIds = result.data;
  645. }
  646. }
  647. });
  648. },
  649. mixUpdateRequest: function(updateArr, addArr, removeIds) {
  650. var me = repositoryGljObj;
  651. $.ajax({
  652. type:"POST",
  653. url:"api/mixUpdateGljItems",
  654. data:{"repositoryId": me.currentRepositoryId, "lastOpr": userAccount, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
  655. dataType:"json",
  656. cache:false,
  657. timeout:5000,
  658. success:function(result){
  659. if (result.error) {
  660. alert(result.message);
  661. me.getRationItems(me.currentRepositoryId);
  662. } else {
  663. me.updateCache(addArr, updateArr, removeIds, result);
  664. me.sortGlj();
  665. if(me.currentOprParent === 1){
  666. me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
  667. }
  668. else{
  669. me.currentCache = me.getCache();
  670. //sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
  671. sheetsOprObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
  672. //sheetCommonObj.lockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
  673. }
  674. me.showGljItems(me.gljList, me.gljCurTypeId);
  675. }
  676. },
  677. error:function(err){
  678. alert("保存失败");
  679. }
  680. })
  681. },
  682. getParentCache: function (nodes) {
  683. let me = repositoryGljObj, rst = [];
  684. for(let i = 0; i < me.gljList.length; i++){
  685. if(nodes.indexOf(me.gljList[i].gljClass) !== -1){
  686. rst.push(me.gljList[i]);
  687. }
  688. }
  689. rst.sort(function (a, b) {
  690. let rst = 0;
  691. if(a.code > b.code) rst = 1;
  692. else if(a.code < b.code)rst = -1;
  693. return rst;
  694. });
  695. return rst;
  696. },
  697. getCache: function() {
  698. var me = this, rst = [];
  699. for (var i = 0; i < me.gljList.length; i++) {
  700. if (me.gljList[i].gljClass == me.gljCurTypeId) {
  701. rst.push(me.gljList[i]);
  702. }
  703. }
  704. return rst;
  705. },
  706. updateCache: function(addArr, updateArr, removeIds, result) {
  707. var me = this, cacheSection = me.gljList;
  708. if (addArr.length > 0) {
  709. me.gljList = me.gljList.concat(addArr);
  710. cacheSection = me.gljList;
  711. }
  712. for (var i = removeIds.length - 1; i >= 0; i--) {
  713. for (var j = cacheSection.length - 1; j >= 0 ; j--) {
  714. if (cacheSection[j]["ID"] == removeIds[i]) {
  715. cacheSection.splice(j,1);
  716. }
  717. }
  718. }
  719. if (result && result.data.ops && result.data.ops.length > 0) {
  720. for (var i = 0; i < result.data.ops.length; i++) {
  721. for (var j = 0; j < cacheSection.length; j++) {
  722. if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
  723. cacheSection[j]["ID"] = result.data.ops[i]["ID"];
  724. }
  725. }
  726. }
  727. }
  728. for (var i = 0; i < updateArr.length; i++) {
  729. for (var j = 0; j < cacheSection.length; j++) {
  730. if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
  731. if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
  732. cacheSection[j] = updateArr[i];
  733. }
  734. } else {
  735. if (cacheSection[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
  736. cacheSection[j] = updateArr[i];
  737. }
  738. }
  739. }
  740. }
  741. },
  742. sortGlj: function() {
  743. var me = this;
  744. me.gljList.sort(function(a, b){
  745. var rst = 0;
  746. if (a.code > b.code) rst = 1
  747. else if (a.code < b.code) rst = -1;
  748. return rst;
  749. });
  750. }
  751. }
  752. var gljTypeTreeOprObj = {
  753. onClick: function(event,treeId,treeNode) {
  754. var me = repositoryGljObj,
  755. gljTypeId = treeNode.ID;
  756. me.gljCurTypeId = treeNode.ID;
  757. if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
  758. me.currentOprParent = 1;
  759. me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + treeNode.ID]);
  760. // sheetCommonObj.lockCodeCells(me.workBook.getSheet(0), me.currentCache.length);
  761. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  762. } else {
  763. me.currentOprParent = 0;
  764. me.currentCache = me.getCache();
  765. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  766. /*sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
  767. sheetCommonObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);*/
  768. }
  769. me.showGljItems(me.gljList, gljTypeId);
  770. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  771. },
  772. beforeRename: function(treeId, treeNode, newName, isCancel) {
  773. if (newName.length == 0) {
  774. return false;
  775. }
  776. return true;
  777. },
  778. onRename : function(e, treeId, treeNode, isCancel) {
  779. var nodes = [];
  780. nodes.push(treeNode);
  781. gljTypeTreeOprObj.updateNodes(nodes);
  782. },
  783. onBeforeRemove: function(treeId, treeNode){
  784. let me = this;
  785. if (treeNode.ParentID == -1 && treeNode.isFirstNode) {
  786. alert("不允许删除全部!");
  787. return false;
  788. }
  789. if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
  790. return false;
  791. }
  792. var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
  793. if (preNode) {
  794. preNodeId = preNode.ID;
  795. }
  796. private_fetchAllSubItems = function(pItem){
  797. nodeIds.push(pItem.ID);
  798. if (pItem.items && pItem.items.length > 0) {
  799. for (var i = 0; i < pItem.items.length; i++) {
  800. private_fetchAllSubItems(pItem.items[i]);
  801. }
  802. }
  803. };
  804. nodeIds.push(treeNode.ID);
  805. for (var i = 0; i < treeNode.items.length; i++) {
  806. private_fetchAllSubItems(treeNode.items[i]);
  807. }
  808. $.ajax({
  809. type:"POST",
  810. url:"api/deleteGljNodes",
  811. data:{"repId": pageOprObj.rationLibId, "lastOpr": userAccount, "nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
  812. dataType:"json",
  813. cache:false,
  814. timeout:5000,
  815. success:function(result,textStatus,status){
  816. var pNode = treeNode.getParentNode();
  817. if (pNode && pNode.items && pNode.items.length == 1) {
  818. pNode.isParent = false;
  819. }
  820. },
  821. error:function(){
  822. }
  823. });
  824. return true;
  825. },
  826. onRemove: function(e, treeId, treeNode){
  827. var me = repositoryGljObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  828. if (pNode && pNode.items && pNode.items.length == 0) {
  829. pNode.isParent = false;
  830. me.treeObj.refresh();
  831. }
  832. },
  833. updateNodes: function(nodes){
  834. if (nodes && nodes.length > 0) {
  835. var reqData = []
  836. for (var i = 0; i < nodes.length; i++) {
  837. var node = {};
  838. node.repositoryId = nodes[i].repositoryId;
  839. node.ID = nodes[i].ID;
  840. node.ParentID = nodes[i].ParentID;
  841. node.NextSiblingID = nodes[i].NextSiblingID;
  842. node.Name = nodes[i].Name;
  843. if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
  844. else node.__v = 0;
  845. reqData.push(node);
  846. }
  847. $.ajax({
  848. type:"POST",
  849. url:"api/updateGljNodes",
  850. data:{"repId": pageOprObj.rationLibId, "lastOpr": userAccount, "nodes": JSON.stringify(reqData)},
  851. dataType:"json",
  852. cache:false,
  853. timeout:5000,
  854. success:function(result,textStatus,status){
  855. console.log(status + ' : ' + result);
  856. },
  857. error:function(){
  858. }
  859. })
  860. }
  861. },
  862. addRootNode: function() {
  863. var me = repositoryGljObj, rawNode = {ParentID: -1, NextSiblingID: -1, Name: "所有"}, lastNodeId = -1;
  864. if (me.treeObj) {
  865. var rootNodes = me.treeObj.getNodes();
  866. if (rootNodes.length == 0) {
  867. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  868. if (!(err)) {
  869. var newNodes = [], isSilent = false;
  870. newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"所有",isParent:false, items:[]});
  871. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  872. }
  873. });
  874. }
  875. }
  876. },
  877. addNewNode : function(rawNode, lastNodeId, callback){
  878. $.ajax({
  879. type:"POST",
  880. url:"api/createNewGljTypeNode",
  881. data:{"lastOpr": userAccount, "repositoryId": repositoryGljObj.currentRepositoryId,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
  882. dataType:"json",
  883. cache:false,
  884. timeout:1000,
  885. success: function(result,textStatus,status){
  886. callback(false, result);
  887. },
  888. error:function(err){
  889. callback(err);
  890. }
  891. })
  892. },
  893. addHoverDom: function(treeId, treeNode) {
  894. if(typeof treeNode.doing !== 'undefined' && treeNode.doing){
  895. return false;
  896. }
  897. hoverOpr();
  898. function hoverOpr(){
  899. //console.log(treeNode);
  900. var me = repositoryGljObj, sObj = $("#" + treeNode.tId + "_span");
  901. if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
  902. var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
  903. sObj.after(addStr);
  904. var btn = $("#addBtn_"+treeNode.tId);
  905. if (btn) btn.bind("click", function(){
  906. treeNode.doing = true;
  907. var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, Name: "新增子节点"}, lastNodeId = -1;
  908. if (treeNode.items.length > 0) {
  909. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  910. }
  911. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  912. if (!(err)) {
  913. var newNodes = [], isSilent = false;
  914. if(treeNode.items.length > 0){
  915. treeNode.items[treeNode.items.length - 1].NextSiblingID = rst.data.ID;
  916. }
  917. newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"新增子节点",isParent:false, items:[]});
  918. treeNode.isParent = true;
  919. if (me.treeObj) {
  920. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  921. } else {
  922. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), gljSetting, newNodes);
  923. }
  924. treeNode.doing = false;
  925. hoverOpr();
  926. }
  927. });
  928. });
  929. }
  930. },
  931. removeHoverDom: function(treeId, treeNode) {
  932. $("#addBtn_"+treeNode.tId).unbind().remove();
  933. }
  934. }