repository_glj.js 42 KB

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