glj.js 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. /**
  2. * Created by Zhong on 2017/8/14.
  3. */
  4. const digital = {
  5. basePrice: -2,
  6. consumeAmt: -3
  7. };
  8. let pageOprObj = {
  9. gljLibName : null,
  10. gljLibId: null,
  11. initPage : function(container, containerComponent, containerC) {
  12. let me = this, gljLibId = getQueryString("gljLibId");//获取定额库参数
  13. me.gljLibId = gljLibId;
  14. repositoryGljObj.getGljLib(gljLibId, function () {
  15. repositoryGljObj.buildSheet(container);
  16. gljComponentOprObj.buildSheet(containerComponent);
  17. componentOprObj.buildSheet(containerC);
  18. //获得定额库中引用此工料机库中的,所有被定额所套的工料机的ID
  19. //repositoryGljObj.getRationGljIds(gljLibId);
  20. repositoryGljObj.getGljDistType(function () {
  21. repositoryGljObj.currentRepositoryId = parseInt(gljLibId);
  22. /* repositoryGljObj.getGljTree(gljLibId, function () {
  23. repositoryGljObj.getGljItems(gljLibId);
  24. });*/
  25. repositoryGljObj.getGljItems(gljLibId, function () {
  26. gljClassTreeObj.getGljClassTree(gljLibId);
  27. })
  28. });
  29. });
  30. }
  31. };
  32. let repositoryGljObj = {
  33. treeObj : null,
  34. workBook: null,
  35. gljCurTypeId: -1,
  36. currentRepositoryId: -1,
  37. currentCache: null,
  38. parentNodeIds: {},
  39. gljList: [],
  40. allowComponent: [202, 203, 204, 301, 4],//可带组成物类型:混凝土、砂浆、配合比、机械台班
  41. componentGljType: [201, 302, 303, 4],//可成为组成物的工料机类型: 普通材料、 机械组成物、 机上人工
  42. materialType: ['钢材', '木材', '水泥', '钢筋', '标准砖'],//三材类别
  43. distTypeTree: null,//add
  44. setting: {
  45. owner: "glj",
  46. header:[
  47. {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
  48. {headerName:"名称",headerWidth:160,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
  49. {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
  50. {headerName:"单位",headerWidth:45,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
  51. {headerName:"定额价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
  52. {headerName:"类型",headerWidth:90,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
  53. {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
  54. {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
  55. {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
  56. ],
  57. view:{
  58. comboBox:[
  59. {row:-1,col:3,rowCount:-1,colCount:1}
  60. ],
  61. lockedCells:[
  62. ]
  63. }
  64. },
  65. getComboData: function (gljDistType) {
  66. let me = this;
  67. let distType;
  68. let distTypeTree = {
  69. prefix : 'gljType',
  70. distTypes: {},
  71. comboDatas: [],
  72. distTypesArr: []
  73. };
  74. gljDistType.forEach(function (typeData) {
  75. let typeObj = {
  76. data: typeData,
  77. children: [],
  78. parent: null
  79. }
  80. distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
  81. distTypeTree.distTypesArr.push(typeObj);
  82. });
  83. gljDistType.forEach(function (typeData) {
  84. distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
  85. let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
  86. if(parent){
  87. distType.parent = parent;
  88. parent.children.push(distType);
  89. }
  90. });
  91. distTypeTree.distTypesArr.forEach(function (distTypeObj) {
  92. if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
  93. distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
  94. }
  95. });
  96. return distTypeTree;
  97. },
  98. getGljDistType: function (callback) {
  99. let me = this;
  100. $.ajax({
  101. type: 'post',
  102. url: "api/getGljDistType",
  103. dataType: 'json',
  104. success: function (result) {
  105. if(!result.error && callback){
  106. me.distTypeTree = me.getComboData(result.data);
  107. console.log(me.distTypeTree);
  108. callback();
  109. }
  110. }
  111. })
  112. },
  113. getGljLib: function (libId, callback) {
  114. let me = repositoryGljObj;
  115. $.ajax({
  116. type: 'post',
  117. url: 'api/getGljLib',
  118. data: {libId: libId},
  119. dataType: 'json',
  120. success: function (result) {
  121. if(!result.error){
  122. if(result.data.length > 0){
  123. me.rationLibs = result.data[0].rationLibs;
  124. $(".navbar-text").append(
  125. "<a href='/stdGljRepository/main'>工料机库</a><i class='fa fa-angle-right fa-fw'></i>"+result.data[0].dispName
  126. );
  127. pageOprObj.gljLibName = result.data[0].dispName;
  128. }
  129. callback();
  130. }
  131. }
  132. })
  133. },
  134. getGljTree: function(gljLibId, callback) {
  135. let me = this;
  136. $.ajax({
  137. type:"POST",
  138. url:"api/getGljTree",
  139. data:{"gljLibId": gljLibId},
  140. dataType:"json",
  141. cache:false,
  142. timeout:20000,
  143. success:function(result,textStatus,status){
  144. if(status.status == 200) {
  145. zTreeHelper.createTree(result.data, gljSetting, "repositoryTree", me);
  146. zTreeHelper.createTree(result.data, componentSetting, "componentTree", componentOprObj);
  147. if (result.data && result.data.length > 0) {
  148. me.gljCurTypeId = result.data[0].ID;
  149. } else {
  150. //重新创建库?
  151. gljTypeTreeOprObj.addRootNode();
  152. }
  153. callback();
  154. }
  155. },
  156. error:function(err){
  157. alert(err.responseJSON.error);
  158. }
  159. })
  160. },
  161. getGljItems: function(repId, callback) {
  162. let me = this;
  163. $.ajax({
  164. type:"POST",
  165. url:"api/getGljItems",
  166. data:{"repositoryId": repId},
  167. dataType:"json",
  168. cache:false,
  169. timeout:20000,
  170. success:function(result){
  171. if(!result.error) {
  172. me.gljList = result.data;
  173. me.workBook.getSheet(0).setRowCount(result.data.length);
  174. me.sortGlj();
  175. me.currentGlj = me.gljList.length > 0 ? me.gljList[0] : null;//初始
  176. if(callback){
  177. callback();
  178. }
  179. }
  180. },
  181. error:function(err){
  182. alert(err.responseJSON.error);
  183. }
  184. })
  185. },
  186. showGljItems: function(data, type) {
  187. let me = repositoryGljObj;
  188. if (me.workBook) {
  189. let cacheSection = data;
  190. sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
  191. sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
  192. sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), 0, 5, me.workBook.getActiveSheet().getRowCount(), me.distTypeTree.comboDatas, false, 'text');
  193. sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), 0, 7, me.workBook.getActiveSheet().getRowCount(), me.materialType, false, 'text');
  194. cacheSection = null;
  195. }
  196. },
  197. buildSheet: function(container) {
  198. let me = repositoryGljObj;
  199. me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
  200. me.repositoryGljDelOpr();
  201. me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
  202. me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
  203. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
  204. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
  205. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
  206. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.LeaveCell, me.onLeaveCell);
  207. me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
  208. },
  209. isDef: function (v) {
  210. return v !== undefined && v !== null;
  211. },
  212. //成为了组成物,暂时只需要判断主材的
  213. isComponent: function (gljId, gljList) {
  214. for(let i = 0, len = gljList.length; i < len; i++){
  215. let gljComponent = gljList[i].component;
  216. if(gljList[i].gljType === 4 && this.isDef(gljComponent) && gljComponent.length > 0){
  217. for(let j = 0, jLen = gljComponent.length; j < jLen; j++){
  218. if(gljComponent[j].ID === gljId){
  219. return true;
  220. }
  221. }
  222. }
  223. }
  224. return false;
  225. },
  226. getCurrentComponent: function (gljComponent) {
  227. let me = repositoryGljObj, rst = [];
  228. for(let i = 0; i < gljComponent.length; i++){
  229. let obj = {};
  230. for(let j = 0; j < me.gljList.length; j++){
  231. if(gljComponent[i].ID == me.gljList[j].ID){
  232. obj.ID = me.gljList[j].ID;
  233. obj.code = me.gljList[j].code;
  234. obj.name = me.gljList[j].name;
  235. obj.unit = me.gljList[j].unit;
  236. obj.basePrice = me.gljList[j].basePrice;
  237. obj.consumeAmt = gljComponent[i].consumeAmt;
  238. rst.push(obj);
  239. }
  240. }
  241. }
  242. rst.sort(function (a, b) {
  243. let r = 0;
  244. if(a.code > b.code) r = 1;
  245. else if(a.code < b.code) r = -1;
  246. return r;
  247. });
  248. return rst;
  249. },
  250. //获得引用了组成物id为componentId的工料机,和重新变化组成物数组、重新计算单价
  251. getUpdateGljs: function (rObj, isDelete) {
  252. let me = repositoryGljObj, that = gljComponentOprObj,
  253. rst = {updateArr: [], updateBasePrcArr: []};
  254. //改变单价,以便reCalGljBasePrc方法可行
  255. if(!isDelete){
  256. for(let i = 0; i < me.gljList.length; i++){
  257. if(me.gljList[i].ID === rObj.ID){
  258. me.gljList[i].basePrice = rObj.basePrice;
  259. break;
  260. }
  261. }
  262. }
  263. for(let i = 0; i < me.gljList.length; i++){
  264. let thisComponent = me.gljList[i].component, isChange = false;
  265. for(let j = 0; j < thisComponent.length; j++){
  266. if(thisComponent[j].ID === rObj.ID){
  267. //删除
  268. isChange = true;
  269. if(isDelete){
  270. thisComponent.splice(j--, 1);
  271. }
  272. else {
  273. break;
  274. }
  275. }
  276. }
  277. if(isChange){//引用了此组成物
  278. let gljBasePrc = that.reCalGljBasePrc(me.getCurrentComponent(thisComponent));
  279. if(me.gljList[i].basePrice !== gljBasePrc){
  280. me.gljList[i].basePrice = gljBasePrc;
  281. rst.updateBasePrcArr.push({gljId: me.gljList[i].ID, gljType: me.gljList[i].gljType, basePrice: me.gljList[i].basePrice});
  282. }
  283. rst.updateArr.push(me.gljList[i]);
  284. }
  285. }
  286. return rst;
  287. },
  288. reshowGljBasePrc: function (glj) {
  289. let me = repositoryGljObj;
  290. let cacheSection = me.currentCache;
  291. for(let i = 0; i < cacheSection.length; i++){
  292. if(glj.ID === cacheSection[i].ID){
  293. cacheSection[i].basePrice = glj.basePrice;
  294. me.workBook.getSheet(0).setValue(i, 4, glj.basePrice);
  295. break;
  296. }
  297. }
  298. },
  299. onSelectionChanged: function (sender, info) {
  300. let me = repositoryGljObj, that = gljComponentOprObj;
  301. //混凝土202、砂浆203、配合比204、机械3
  302. if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
  303. let row = info.newSelections[0].row;
  304. sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, -1);
  305. me.workBook.focus(true);
  306. me.currentComponent = [];
  307. that.workBook.getSheet(0).setRowCount(10);
  308. if(row < me.currentCache.length){
  309. //标记当前工料机
  310. me.currentGlj = me.currentCache[row];
  311. if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
  312. //展示数据
  313. if(me.currentGlj.component.length > 0){
  314. me.currentComponent = me.getCurrentComponent(me.currentGlj.component);
  315. if(me.currentComponent.length > 0){
  316. sheetsOprObj.showData(that.workBook.getSheet(0), that.setting, me.currentComponent);
  317. }
  318. }
  319. }
  320. }
  321. else{
  322. me.currentGlj = null;
  323. }
  324. }
  325. },
  326. onLeaveCell: function (sender, args) {
  327. let me = repositoryGljObj;
  328. me.lastCol = args.col
  329. },
  330. onEnterCell: function (sender, args) {
  331. let me = repositoryGljObj;
  332. let thisDataCode = me.setting.header[args.col].dataCode,
  333. lastDataCode = me.setting.header[me.lastCol].dataCode;
  334. if(thisDataCode === 'gljType' || lastDataCode === 'gljType'
  335. || thisDataCode === 'materialType' || lastDataCode === 'materialType'){
  336. args.sheet.repaint();
  337. }
  338. me.cellRowIdx = args.row;
  339. let isHasData = false;
  340. if(me.addGljObj){
  341. for(let i=0; i<me.setting.header.length; i++){
  342. if(me.addGljObj[me.setting.header[i].dataCode]){
  343. isHasData = true;
  344. break;
  345. }
  346. }
  347. }
  348. if(isHasData){
  349. if(me.editingRowIdx !== me.cellRowIdx) {
  350. let isComple = true;
  351. let focusToCol;
  352. function getFocusToCol (me){
  353. if(!me.addGljObj[me.setting.header[0].dataCode]){
  354. $('#alertGljTxt').text('编号不能为空,继续增加工料机?');
  355. return 0;
  356. }
  357. else if(!me.addGljObj[me.setting.header[1].dataCode]){
  358. $('#alertGljTxt').text('名称不能为空,继续增加工料机?');
  359. return 1;
  360. }
  361. else if(!me.addGljObj[me.setting.header[5].dataCode]){
  362. $('#alertGljTxt').text('类型不能为空,继续增加工料机?');
  363. return 5;
  364. }
  365. else {
  366. return -1;
  367. }
  368. }
  369. focusToCol = getFocusToCol(me);
  370. if(focusToCol === -1){
  371. }
  372. else {
  373. $('#gljAlertBtn').click();
  374. $('#aleConfBtn').click(function () {
  375. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  376. });
  377. $('#gljAleClose').click(function () {
  378. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  379. });
  380. $('#aleCanceBtn').click(function () {
  381. me.addGljObj = null;
  382. for(let col=0; col<me.setting.header.length; col++){
  383. if(col === 0){
  384. me.workBook.getSheet(0).getCell(me.editingRowIdx, 0).formatter("@");
  385. }
  386. me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value('');
  387. }
  388. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
  389. });
  390. }
  391. }
  392. }
  393. },
  394. onCellEditStart: function(sender, args) {
  395. let me = repositoryGljObj;
  396. let rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
  397. if(me.prevent){
  398. args.cancel = true;
  399. return;
  400. }
  401. me.currentEditingGlj = rObj;
  402. me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
  403. if(args.row < me.currentCache.length){
  404. let dataCode = me.setting.header[args.col].dataCode;
  405. me.currentGlj = me.currentCache[args.row];
  406. if(dataCode === 'code' || (dataCode === 'basePrice' && me.allowComponent.indexOf(me.currentGlj.gljType) !== -1
  407. && me.currentGlj.component.length > 0)
  408. || (dataCode === 'adjCoe' && me.currentGlj.gljType !== 1 && me.currentGlj.gljType !== 303)
  409. || (dataCode === 'materialCoe' && !me.currentGlj.materialType)){
  410. args.cancel = true;
  411. }
  412. else {
  413. rObj.ID = me.currentGlj.ID;
  414. rObj.gljClass = me.currentGlj.gljClass;
  415. }
  416. }
  417. else {
  418. me.currentGlj = null;
  419. }
  420. },
  421. onCellEditEnd: function(sender, args) {
  422. let me = repositoryGljObj, that = gljComponentOprObj,
  423. rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
  424. updateArr = [], addArr = [], updateBasePrcArr = [];
  425. me.editingRowIdx = args.row;
  426. rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
  427. //更新
  428. if (me.currentEditingGlj["ID"] && me.currentGlj) {
  429. rObj["ID"] = me.currentEditingGlj["ID"];
  430. rObj.gljClass = me.currentEditingGlj.gljClass;
  431. if(me.currentEditingGlj[me.setting.header[args.col].dataCode] !== rObj[me.setting.header[args.col].dataCode]){
  432. if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[1].dataCode] && rObj[me.setting.header[5].dataCode] &&
  433. rObj[me.setting.header[0].dataCode].toString().trim().length !== 0 && rObj[me.setting.header[1].dataCode].toString().trim().length !== 0 && rObj[me.setting.header[5].dataCode].toString().trim().length !== 0){
  434. if(rObj.gljType !== me.currentEditingGlj.gljType){//修改了工料机类型
  435. if(me.currentGlj){
  436. me.currentGlj.component = [];
  437. }
  438. /*if(me.allowComponent.indexOf(rObj.gljType) !== -1){//更改成可添加组成物的类型,则将定额价设成零
  439. rObj.basePrice = 0;
  440. }*/
  441. //调整系数,工料机类型为人工和机上人工时,可输入整数
  442. if((me.currentEditingGlj.gljType === 1 || me.currentEditingGlj.gljType === 303) && !(rObj.gljType === 1 || rObj.gljType === 303)){
  443. rObj.adjCoe = null;
  444. }
  445. if(me.componentGljType.indexOf(me.currentEditingGlj.gljType) !== -1 &&
  446. !(me.currentEditingGlj.gljType === 302 && rObj.gljType === 303) && !(me.currentEditingGlj.gljType === 303 && rObj.gljType === 302)){//修改了原本是组成物的工料机
  447. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  448. let updateGljs = me.getUpdateGljs(rObj, true);
  449. if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
  450. for(let i = 0; i < updateGljs.updateArr.length; i++){
  451. updateArr.push(updateGljs.updateArr[i]);
  452. }
  453. for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
  454. updateArr.push(updateGljs.updateBasePrcArr[i]);
  455. }
  456. }
  457. }
  458. sheetCommonObj.cleanData(that.workBook.getSheet(0), that.setting, 5);
  459. }
  460. else if(rObj.adjCoe !== me.currentEditingGlj.adjCoe){//修改调整系数,整数控制
  461. if(isNaN(rObj.adjCoe) || rObj.adjCoe % 1 !== 0){
  462. args.sheet.setValue(args.row, args.col, me.currentEditingGlj.adjCoe ? me.currentEditingGlj.adjCoe : '');
  463. alert('调整系数只能输入整数!');
  464. return;
  465. }
  466. }
  467. else if(rObj.materialCoe !== me.currentEditingGlj.materialCoe){
  468. if(isNaN(rObj.materialCoe)){
  469. args.sheet.setValue(args.row, args.col, me.currentEditingGlj.materialCoe ? me.currentEditingGlj.materialCoe : '');
  470. alert('三材系数只能输入数值!');
  471. return;
  472. }
  473. rObj.materialCoe = scMathUtil.roundTo(parseFloat(rObj.materialCoe), -5);
  474. }
  475. else if(rObj.basePrice !== me.currentEditingGlj.basePrice){//修改了单价,可修改单价的必为可成为组成物的
  476. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  477. if(isNaN(parseFloat(rObj.basePrice))){
  478. alert('单价只能输入数值!');
  479. args.sheet.setValue(args.row, args.col, me.currentEditingGlj.basePrice ? me.currentEditingGlj.basePrice : 0);
  480. return;
  481. }
  482. rObj.basePrice = !isNaN(parseFloat(rObj.basePrice))? scMathUtil.roundTo(parseFloat(rObj.basePrice), -2) : me.currentEditingGlj.basePrice;
  483. let updateGljs = me.getUpdateGljs(rObj);
  484. if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
  485. for(let i = 0; i < updateGljs.updateArr.length; i++){
  486. updateArr.push(updateGljs.updateArr[i]);
  487. }
  488. for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
  489. updateArr.push(updateGljs.updateBasePrcArr[i]);
  490. }
  491. }
  492. }
  493. rObj.component = me.currentGlj.component;
  494. updateArr.push(rObj);
  495. }
  496. else{
  497. if(me.setting.header[args.col].dataCode === 'gljType'){
  498. let distTypeVal = me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj[me.setting.header[args.col].dataCode]].data.fullName;
  499. args.sheet.setValue(args.row, args.col, distTypeVal);
  500. }
  501. else{
  502. args.sheet.setValue(args.row, args.col, me.currentEditingGlj[me.setting.header[args.col].dataCode]);
  503. }
  504. }
  505. }
  506. //--------------------------------------
  507. if(me.currentEditingGlj.basePrice !== rObj.basePrice){
  508. //update basePrice of ration when editting basePrice of glj
  509. let gljType = -1;
  510. let gljTypeParent = me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj.gljType].parent;
  511. if(gljTypeParent && gljTypeParent.data.ID <=3){
  512. gljType = gljTypeParent.data.ID;
  513. }
  514. if(!gljTypeParent && me.currentEditingGlj.gljType <= 3){
  515. gljType = me.currentEditingGlj.gljType;
  516. }
  517. let gljBasePrcObj = {gljId: me.currentEditingGlj.ID, gljType: gljType, basePrice: rObj.basePrice};
  518. if(gljBasePrcObj.gljType !== -1){
  519. updateBasePrcArr.push(gljBasePrcObj);
  520. if(me.rationLibs.length > 0){//重算定额单价
  521. me.updateRationBasePrcRq(updateBasePrcArr);
  522. }
  523. }
  524. }
  525. //update basePrice of ration when editting gljType of glj
  526. if(me.currentEditingGlj.gljType !== rObj.gljType){
  527. let gljTypeObj = {gljId: me.currentEditingGlj.ID, gljType: rObj.gljType, basePrice: rObj.basePrice};
  528. updateBasePrcArr.push(gljTypeObj);
  529. if(me.rationLibs.length > 0){
  530. me.updateRationBasePrcRq(updateBasePrcArr);
  531. }
  532. }
  533. //-----------------------------------------------------------
  534. }
  535. //新增
  536. else {
  537. if(typeof rObj.code !== 'undefined'){
  538. me.addGljObj = rObj;
  539. let isCanSav = true;
  540. if(!rObj[me.setting.header[0].dataCode] || !rObj[me.setting.header[1].dataCode] || !rObj[me.setting.header[5].dataCode]){
  541. isCanSav = false;
  542. }
  543. if(isCanSav){
  544. me.addGljObj = null;
  545. rObj.component = [];
  546. //如果类型为混凝土、砂浆、配合比、机械台班时,添加时填写的单价清空
  547. /*if(me.allowComponent.indexOf(rObj.gljType) !== -1){
  548. rObj.basePrice = 0;
  549. }*/
  550. rObj.basePrice = !isNaN(parseFloat(rObj.basePrice)) && (rObj.basePrice && typeof rObj.basePrice !== 'undefined') ? scMathUtil.roundTo(parseFloat(rObj.basePrice), -2) : 0;
  551. addArr.push(rObj);
  552. }
  553. }
  554. }
  555. if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
  556. rObj.gljClass = me.gljCurTypeId;
  557. }
  558. if(updateArr.length >0 || addArr.length >0){
  559. me.currentEditingGlj = null;
  560. me.mixUpdateRequest(updateArr, addArr, []);
  561. }
  562. },
  563. repositoryGljDelOpr: function () {
  564. let me = repositoryGljObj;
  565. me.workBook.commandManager().register('repositoryGljDel', function () {
  566. let sheet = me.workBook.getSheet(0),
  567. updateArr = [], removeArr = [],
  568. tempRemoveArr= [],
  569. refGljCodes = [], //已被引用的工料机
  570. updateBasePrcArr = [],//删除基价单位后重新计算
  571. sels = sheet.getSelections(),
  572. canUpdate = false,
  573. cacheSection = me.currentCache;
  574. if(sels.length > 0 && cacheSection.length > 0){
  575. for(let i = 0; i < sels.length; i++){
  576. if(sels[i].colCount === me.setting.header.length){
  577. for(let j = 0; j < sels[i].rowCount; j++){
  578. if(sels[i].row + j < cacheSection.length){
  579. //删除了已被引用成组成物的工料机,重新计算所有引用此组成物的工料机的单价、组成物数组
  580. let updateGljs = me.getUpdateGljs(cacheSection[sels[i].row + j], true);
  581. if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
  582. for(let i = 0; i < updateGljs.updateArr.length; i++){
  583. updateArr.push(updateGljs.updateArr[i]);
  584. }
  585. for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
  586. updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  587. }
  588. }
  589. removeArr.push(cacheSection[sels[i].row + j].ID);
  590. //tempRemoveArr.push({ID: cacheSection[sels[i].row + j].ID, code: cacheSection[sels[i].row + j].code});
  591. //删除后重新计算引用了此工料机的定额单价
  592. updateBasePrcArr.push({gljId: cacheSection[sels[i].row + j].ID, gljType: cacheSection[sels[i].row + j].gljType, basePrice: 0, delete: 1});
  593. }
  594. }
  595. }
  596. else{
  597. let maxCol = sels[i].col + sels[i].colCount - 1;
  598. let cantNullDataCode = ['code', 'name', 'gljType'];
  599. for(let j = 0; j < sels[i].rowCount; j++){
  600. if(sels[i].row + j < cacheSection.length){
  601. let updateObj = cacheSection[sels[i].row + j];
  602. for(let col = sels[i].col; col <= maxCol; col++){
  603. let dataCode = me.setting.header[col].dataCode;
  604. if(cantNullDataCode.includes(dataCode)){
  605. $('#alertText').text(me.setting.header[col].headerName + "不可为空!");
  606. $('#codeAlert').modal('show');
  607. return false;
  608. }
  609. else {
  610. if(dataCode === 'basePrice'){
  611. //如果类型不为混凝土、砂浆、配合比、机械、主材且无组成物,才可删除单价 basePrice = 0
  612. if(me.allowComponent.indexOf(updateObj.gljType) === -1 ||
  613. (me.allowComponent.indexOf(updateObj.gljType) !== -1 && updateObj.component.length === 0)){
  614. canUpdate = true;
  615. updateObj[dataCode] = 0;
  616. updateBasePrcArr.push({gljId: updateObj.ID, gljType: updateObj.gljType, basePrice: 0});
  617. }
  618. }
  619. else{
  620. if(dataCode === 'materialType'){
  621. updateObj['materialCoe'] = null;
  622. }
  623. canUpdate = true;
  624. updateObj[dataCode] = '';
  625. }
  626. }
  627. }
  628. if(canUpdate){
  629. updateArr.push(updateObj);
  630. }
  631. }
  632. }
  633. }
  634. }
  635. if(removeArr.length > 0 || updateArr.length > 0){
  636. //删除警告
  637. let upAlertText = removeArr.length > 0 ? '可能已有定额引用了当前工料机,导致定额查找不到此工料机。确定要删除吗?' : '确认删除选中字段?';
  638. $('#alertGljTxt').text(upAlertText);
  639. $('#gljAlertBtn').click();
  640. //确认
  641. $('#aleConfBtn').click(function () {
  642. me.mixUpdateRequest(updateArr, [], removeArr);
  643. if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
  644. me.updateRationBasePrcRq(updateBasePrcArr);
  645. }
  646. });
  647. }
  648. }
  649. });
  650. me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
  651. me.workBook.commandManager().setShortcutKey('repositoryGljDel', GC.Spread.Commands.Key.del, false, false, false, false);
  652. },
  653. validUpdateObj: function (pasteObj, rowIdx) {
  654. let rst = {updateGlj: [], updateBasePrcArr: []}, backUpObj = {},
  655. me = repositoryGljObj,
  656. that = gljComponentOprObj,
  657. tempObj = me.currentCache[rowIdx],
  658. reCalBasePrc = false,
  659. isValid = true;
  660. //备份原始数据
  661. for(let atr in tempObj){
  662. backUpObj[atr] = tempObj[atr];
  663. }
  664. if(typeof pasteObj.code !== 'undefined'){
  665. if(pasteObj.code.trim().length !== 0){
  666. let isExist = false;
  667. for(let i = 0; i < me.gljList.length; i++){
  668. if(me.gljList[i].code === pasteObj.code){
  669. isExist = true;
  670. break;
  671. }
  672. }
  673. if(!isExist){
  674. tempObj.code = pasteObj.code;
  675. }
  676. else isValid = false;
  677. }
  678. else isValid = false;
  679. }
  680. if(typeof pasteObj.name !== 'undefined'){
  681. if(pasteObj.name.trim().length === 0) isValid = false;
  682. else tempObj.name = pasteObj.name;
  683. }
  684. if(typeof pasteObj.specs !== 'undefined'){
  685. tempObj.specs = pasteObj.specs;
  686. }
  687. if(typeof pasteObj.unit !== 'undefined'){
  688. tempObj.unit = pasteObj.unit;
  689. }
  690. if(typeof pasteObj.gljType !== 'undefined'){
  691. let isExsit = false;
  692. for(let i = 0; i < me.distTypeTree.comboDatas.length; i++){
  693. if(pasteObj.gljType === me.distTypeTree.comboDatas[i].text){
  694. isExsit = true;
  695. reCalBasePrc = true;
  696. //调整系数
  697. if(me.distTypeTree.comboDatas[i].value !== 1 && me.distTypeTree.comboDatas[i].value !== 303){
  698. tempObj.adjCoe = null;
  699. }
  700. else if((me.distTypeTree.comboDatas[i].value === 1 || me.distTypeTree.comboDatas[i].value === 303) && typeof pasteObj.adjCoe !== 'undefined' && !isNaN(pasteObj.adjCoe) && pasteObj.adjCoe % 1 === 0) {
  701. tempObj.adjCoe = pasteObj.adjCoe;
  702. }
  703. if(me.componentGljType.indexOf(tempObj.gljType) !== -1 &&
  704. !(tempObj.gljType === 302 && pasteObj.gljType === 303) && !(tempObj.gljType === 303 && pasteObj.gljType === 302)){//修改了原本是组成物的工料机
  705. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  706. let updateGljs = me.getUpdateGljs(tempObj, true);
  707. if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
  708. for(let i = 0; i < updateGljs.updateArr.length; i++){
  709. rst.updateGlj.push(updateGljs.updateArr[i]);
  710. }
  711. for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
  712. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  713. }
  714. }
  715. }
  716. tempObj.component = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.component : [];
  717. /*if(me.allowComponent.indexOf(tempObj.gljType) !== -1){//更改成可含组成物的工料机类型,定额价设置为零
  718. tempObj.basePrice = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.basePrice : 0;
  719. }*/
  720. tempObj.gljType = me.distTypeTree.comboDatas[i].value;
  721. tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
  722. break;
  723. }
  724. }
  725. if(!isExsit) {
  726. isValid = false;
  727. }
  728. }
  729. if(typeof pasteObj.adjCoe !== 'undefined' && typeof pasteObj.gljType === 'undefined'){
  730. if(tempObj.gljType && (tempObj.gljType === 1 || tempObj.gljType === 303) && typeof pasteObj.adjCoe !== 'undefined' && !isNaN(pasteObj.adjCoe) && pasteObj.adjCoe % 1 === 0) {
  731. tempObj.adjCoe = pasteObj.adjCoe;
  732. }
  733. else {
  734. isValid = false;
  735. }
  736. }
  737. if(typeof pasteObj.basePrice !== 'undefined'){
  738. pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? scMathUtil.roundTo(parseFloat(pasteObj.basePrice), -2) :
  739. me.currentCache[rowIdx].basePrice;
  740. if(pasteObj.basePrice !== me.currentCache[rowIdx].basePrice){
  741. reCalBasePrc = true;
  742. tempObj.basePrice = pasteObj.basePrice;
  743. let updateGljs = me.getUpdateGljs(tempObj, false);
  744. if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
  745. for(let i = 0; i < updateGljs.updateArr.length; i++){
  746. rst.updateGlj.push(updateGljs.updateArr[i]);
  747. }
  748. for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
  749. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  750. }
  751. }
  752. }
  753. }
  754. if(typeof pasteObj.materialType !== 'undefined'){
  755. if(!me.materialType.includes(pasteObj.materialType)){
  756. isValid = false;
  757. }
  758. else {
  759. tempObj.materialType = pasteObj.materialType;
  760. }
  761. }
  762. if(typeof pasteObj.materialCoe !== 'undefined'){
  763. if(isNaN(pasteObj.materialCoe) || (!tempObj.materialType && !pasteObj.materialType)){
  764. isValid = false;
  765. }
  766. else{
  767. tempObj.materialCoe = pasteObj.materialCoe !== '' ? scMathUtil.roundTo(parseFloat(pasteObj.materialCoe), -5) : null;
  768. }
  769. }
  770. if(isValid){
  771. rst.updateGlj.push(tempObj);
  772. if(reCalBasePrc){
  773. //重新计算定额基价对象
  774. //rst.updateBasePrc = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
  775. let newReObj = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
  776. rst.updateBasePrcArr.push(newReObj);
  777. }
  778. }
  779. else {
  780. for(let attr in backUpObj){
  781. tempObj[attr] = backUpObj[attr];
  782. }
  783. }
  784. return rst;
  785. },
  786. //粘贴的数据是否是可添加的数据,只有含有编号,名称,类型才可添加
  787. isValidObj: function(pasteObj) {
  788. let me = repositoryGljObj;
  789. if(!(pasteObj.code && typeof pasteObj.code !== 'undefined') || !(pasteObj.name && typeof pasteObj.name !== 'undefined') ||
  790. !(pasteObj.gljType && typeof pasteObj.gljType !== 'undefined')){
  791. return false;
  792. }
  793. if(pasteObj.gljType && typeof pasteObj.gljType !== 'undefined'){
  794. let isExist = false;
  795. for(let i = 0; i < me.distTypeTree.comboDatas.length; i++){
  796. if(me.distTypeTree.comboDatas[i].text === pasteObj.gljType){
  797. isExist = true;
  798. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  799. pasteObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + pasteObj.gljType].data.shortName;
  800. break;
  801. }
  802. }
  803. if(!isExist){
  804. return false;
  805. }
  806. }
  807. if(pasteObj.code && typeof pasteObj.code !== 'undefined'){
  808. for(let i = 0; i < me.gljList.length; i++){
  809. if(me.gljList[i].code === pasteObj.code){
  810. return false;
  811. }
  812. }
  813. }
  814. if(pasteObj.adjCoe && typeof pasteObj.adjCoe !== 'undefined'){
  815. if(isNaN(pasteObj.adjCoe) || pasteObj.adjCoe % 1 !== 0){
  816. return false;
  817. }
  818. }
  819. if(pasteObj.materialType){
  820. if(!me.materialType.includes(pasteObj.materialType)){
  821. return false;
  822. }
  823. }
  824. if(pasteObj.materialCoe){
  825. if(isNaN(pasteObj.materialCoe) || !pasteObj.materialType){
  826. return false;
  827. }
  828. }
  829. pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
  830. if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
  831. pasteObj.gljClass = me.gljCurTypeId;
  832. }
  833. return true;
  834. },
  835. canPasted: function (info) {
  836. let rst = true;
  837. let me = repositoryGljObj;
  838. if(me.gljCurTypeId < 0){
  839. return false;
  840. }
  841. if(info.cellRange.col + info.cellRange.colCount - 1 > me.setting.header.length - 1){
  842. return false;
  843. }
  844. if(info.cellRange.row < me.currentCache.length){
  845. if(info.cellRange.col === 0){
  846. return false;
  847. }
  848. else if(info.cellRange.col <= 4 && info.cellRange.col + info.cellRange.colCount - 1 >= 4){
  849. for(let i = 0, len = info.cellRange.rowCount; i < len; i++){
  850. let row = i + info.cellRange.row;
  851. if(row < me.currentCache.length){
  852. if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1 && me.currentCache[row].component.length > 0){
  853. rst = false;
  854. }
  855. }
  856. else {
  857. break;
  858. }
  859. }
  860. }
  861. }
  862. return rst;
  863. },
  864. onClipboardPasting: function(sender, args) {
  865. let me = repositoryGljObj;
  866. //复制的列数超过正确的列数,不可复制
  867. if(me.prevent){
  868. args.cancel = true;
  869. return;
  870. }
  871. if(!me.canPasted(args)){
  872. args.cancel = true;
  873. }
  874. },
  875. onClipboardPasted: function(e, info) {
  876. let me = repositoryGljObj;
  877. let updateArr = [], addArr = [];
  878. let items = sheetCommonObj.analyzePasteData(me.setting, info);
  879. let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
  880. maxRow = me.currentCache.length - 1,
  881. updateBasePrcArr = [] ,
  882. updateCount, resumeArr = [];
  883. if(endRow <= maxRow){
  884. //updateItems = items;
  885. for(let i = 0; i < items.length; i++){
  886. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  887. if(updateObj && typeof updateObj.updateGlj !== 'undefined' && updateObj.updateGlj.length > 0){
  888. //updateArr = updateObj.updateGlj;
  889. updateArr = updateArr.concat(updateObj.updateGlj);
  890. if(typeof updateObj.updateBasePrcArr !== 'undefined'){
  891. //updateBasePrcArr = updateObj.updateBasePrc;
  892. updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrcArr);
  893. }
  894. }
  895. else{
  896. resumeArr.push(info.cellRange.row + i);
  897. }
  898. }
  899. }
  900. else if(beginRow <= maxRow && endRow > maxRow){
  901. updateCount = maxRow - beginRow + 1;
  902. for(let i = 0; i < updateCount; i++){
  903. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  904. if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
  905. updateArr = updateArr.concat(updateObj.updateGlj);
  906. if(typeof updateObj.updateBasePrcArr !== 'undefined'){
  907. updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrcArr);
  908. }
  909. }
  910. else{
  911. resumeArr.push(info.cellRange.row + i);
  912. }
  913. }
  914. //if(info.cellRange.colCount === me.setting.header.length){
  915. if(info.cellRange.colCount >= me.setting.header.length - 3 && info.cellRange.colCount <= me.setting.header.length){
  916. for(let i = updateCount ; i < items.length; i++){
  917. if(me.isValidObj(items[i])){
  918. items[i].component = [];
  919. //类型为混凝土、砂浆、配合比、机械时,基价只能组成物计算
  920. /* if(me.allowComponent.indexOf(items[i].gljType) !== -1){
  921. items[i].basePrice = 0;
  922. }*/
  923. addArr.push(items[i]);
  924. }
  925. else{
  926. resumeArr.push(info.cellRange.row + i);
  927. }
  928. }
  929. }
  930. else{
  931. for(let i = updateCount ; i < items.length; i++){
  932. resumeArr.push(info.cellRange.row + i);
  933. }
  934. }
  935. }
  936. else{
  937. //if(info.cellRange.colCount === me.setting.header.length && info.cellRange.col + info.cellRange.colCount - 1 >= 5){
  938. if(info.cellRange.colCount >= me.setting.header.length - 3 && info.cellRange.colCount <= me.setting.header.length && info.cellRange.col + info.cellRange.colCount - 1 >= 5){
  939. for(let i = 0; i < items.length; i++){
  940. if(me.isValidObj(items[i])){
  941. items[i].component = [];
  942. /* if(me.allowComponent.indexOf(items[i].gljType) !== -1){
  943. items[i].basePrice = 0;
  944. }*/
  945. addArr.push(items[i]);
  946. }
  947. else{
  948. resumeArr.push(info.cellRange.row + i);
  949. }
  950. }
  951. }
  952. else{
  953. for(let i = 0; i < items.length; i++){
  954. resumeArr.push(info.cellRange.row + i);
  955. }
  956. }
  957. }
  958. //repaint
  959. if(resumeArr.length > 0){
  960. info.sheet.suspendPaint();
  961. for(let i = 0; i < resumeArr.length ; i++){
  962. if(resumeArr[i] < me.currentCache.length){
  963. for(let col = 0; col < me.setting.header.length; col++){
  964. if(me.setting.header[col].dataCode === 'gljType'){
  965. let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
  966. info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
  967. }
  968. else{
  969. info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
  970. }
  971. }
  972. }
  973. else{
  974. for(let col = 0; col < me.setting.header.length; col++){
  975. info.sheet.setValue(resumeArr[i], col, '');
  976. }
  977. }
  978. }
  979. info.sheet.resumePaint();
  980. }
  981. if (updateArr.length > 0 || addArr.length > 0) {
  982. me.mixUpdateRequest(updateArr, addArr, []);
  983. }
  984. if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
  985. me.updateRationBasePrcRq(updateBasePrcArr);
  986. }
  987. },
  988. updateRationBasePrcRq: function (basePrcArr) {
  989. let me = this;
  990. me.prevent = true;
  991. $.bootstrapLoading.start();
  992. //me.workBook.focus(false);
  993. $.ajax({
  994. type: 'post',
  995. url: 'api/updateRationBasePrc',
  996. data:{basePrcArr: JSON.stringify(basePrcArr)},
  997. dataType: 'json',
  998. success: function (result) {
  999. if(result.error){
  1000. alert("计算定额基价失败");
  1001. }
  1002. $.bootstrapLoading.end();
  1003. me.prevent = false;
  1004. //me.workBook.focus(true);
  1005. }
  1006. });
  1007. },
  1008. /* getRationGljIds: function (repId) {
  1009. let me = repositoryGljObj;
  1010. $.ajax({
  1011. type: 'post',
  1012. url: 'api/getRationGljIds',
  1013. data: {data: JSON.stringify({repId: repId})},
  1014. dataType: 'json',
  1015. success: function(result){
  1016. if(!result.error){
  1017. me.rationGljIds = result.data;
  1018. }
  1019. }
  1020. });
  1021. },*/
  1022. mixUpdateRequest: function(updateArr, addArr, removeIds) {
  1023. let me = repositoryGljObj;
  1024. if(updateArr.length > 0){
  1025. me.saveInString(updateArr)
  1026. }
  1027. if(addArr.length > 0){
  1028. me.saveInString(addArr);
  1029. }
  1030. $.ajax({
  1031. type:"POST",
  1032. url:"api/mixUpdateGljItems",
  1033. data:{"repositoryId": me.currentRepositoryId, "lastOpr": userAccount, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
  1034. dataType:"json",
  1035. cache:false,
  1036. timeout:5000,
  1037. success:function(result){
  1038. if (result.error) {
  1039. alert(result.message);
  1040. } else {
  1041. me.updateCache(addArr, updateArr, removeIds, result);
  1042. me.sortGlj();
  1043. if(me.currentOprParent === 1){
  1044. me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
  1045. }
  1046. else{
  1047. me.currentCache = me.getCache();
  1048. }
  1049. //me.showGljItems(me.gljList, me.gljCurTypeId);
  1050. me.showGljItems(me.currentCache, me.gljCurTypeId);
  1051. //getCurrentGlj
  1052. let row = me.workBook.getSheet(0).getSelections()[0].row;
  1053. me.currentGlj = row < me.currentCache.length ? me.currentCache[row] : null;
  1054. me.currentComponent = me.currentGlj ? me.getCurrentComponent(me.currentGlj.component) : [];
  1055. sheetCommonObj.cleanData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, -1);
  1056. sheetsOprObj.showData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, me.currentComponent);
  1057. }
  1058. },
  1059. error:function(err){
  1060. console.log(err);
  1061. alert("保存失败");
  1062. }
  1063. });
  1064. },
  1065. saveInString: function (datas) {
  1066. for(let i = 0, len = datas.length; i < len; i++){
  1067. let data = datas[i];
  1068. if(_exist(data, 'basePrice')){
  1069. data['basePrice'] = data['basePrice'].toString();
  1070. }
  1071. if(_exist(data, 'component')){
  1072. for(let j = 0, jLen = data['component'].length; j < jLen; j++){
  1073. let comGljObj = data['component'][j];
  1074. if(_exist(comGljObj, 'consumeAmt')){
  1075. comGljObj['consumeAmt'] = comGljObj['consumeAmt'].toString();
  1076. }
  1077. }
  1078. }
  1079. }
  1080. function _exist(data, attr){
  1081. return data && data[attr] !== undefined && data[attr];
  1082. }
  1083. },
  1084. getParentCache: function (nodes) {
  1085. let me = repositoryGljObj, rst = [];
  1086. for(let i = 0; i < me.gljList.length; i++){
  1087. if(nodes.indexOf(me.gljList[i].gljClass) !== -1){
  1088. rst.push(me.gljList[i]);
  1089. }
  1090. }
  1091. rst.sort(function (a, b) {
  1092. let rst = 0;
  1093. if(a.code > b.code) rst = 1;
  1094. else if(a.code < b.code)rst = -1;
  1095. return rst;
  1096. });
  1097. return rst;
  1098. },
  1099. getCache: function() {
  1100. let me = this, rst = [];
  1101. for (let i = 0; i < me.gljList.length; i++) {
  1102. if (me.gljList[i].gljClass == me.gljCurTypeId) {
  1103. rst.push(me.gljList[i]);
  1104. }
  1105. }
  1106. return rst;
  1107. },
  1108. updateCache: function(addArr, updateArr, removeIds, result) {
  1109. let me = this, cacheSection = me.gljList;
  1110. if (addArr.length > 0) {
  1111. me.gljList = me.gljList.concat(addArr);
  1112. cacheSection = me.gljList;
  1113. }
  1114. for (let i = removeIds.length - 1; i >= 0; i--) {
  1115. for (let j = cacheSection.length - 1; j >= 0 ; j--) {
  1116. if (cacheSection[j]["ID"] == removeIds[i]) {
  1117. cacheSection.splice(j,1);
  1118. }
  1119. }
  1120. }
  1121. if (result && result.data && result.data.ops && result.data.ops.length > 0) {
  1122. for (let i = 0; i < result.data.ops.length; i++) {
  1123. for (let j = 0; j < cacheSection.length; j++) {
  1124. if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
  1125. cacheSection[j]["ID"] = result.data.ops[i]["ID"];
  1126. }
  1127. }
  1128. }
  1129. }
  1130. for (let i = 0; i < updateArr.length; i++) {
  1131. for (let j = 0; j < cacheSection.length; j++) {
  1132. if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
  1133. if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
  1134. cacheSection[j] = updateArr[i];
  1135. }
  1136. } else {
  1137. if (cacheSection[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
  1138. cacheSection[j] = updateArr[i];
  1139. }
  1140. }
  1141. }
  1142. }
  1143. },
  1144. updateParentNodeIds: function (nodes, caller) {
  1145. let private_build_parentNodeIds = function(pNodeId, nodesArr){
  1146. let rst = [];
  1147. for (let i = 0; i < nodesArr.length; i++) {
  1148. if (nodesArr[i].children.length > 0) {
  1149. rst = rst.concat(private_build_parentNodeIds(nodesArr[i].data.ID, nodesArr[i].children));
  1150. } else {
  1151. rst.push(nodesArr[i].data.ID);
  1152. }
  1153. }
  1154. if (pNodeId && rst.length > 0) {
  1155. caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
  1156. }
  1157. return rst;
  1158. };
  1159. if (caller.parentNodeIds) {
  1160. private_build_parentNodeIds(null, nodes);
  1161. }
  1162. },
  1163. sortGlj: function() {
  1164. let me = this;
  1165. me.gljList.sort(function(a, b){
  1166. let rst = 0;
  1167. if (a.code > b.code) rst = 1
  1168. else if (a.code < b.code) rst = -1;
  1169. return rst;
  1170. });
  1171. }
  1172. }
  1173. let gljTypeTreeOprObj = {
  1174. onClick: function(event,treeId,treeNode) {
  1175. let me = repositoryGljObj,
  1176. that = gljComponentOprObj,
  1177. gljTypeId = treeNode.ID;
  1178. me.gljCurTypeId = treeNode.ID;
  1179. me.addGljObj = null;
  1180. sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
  1181. if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
  1182. me.currentOprParent = 1;
  1183. me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + treeNode.ID]);
  1184. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  1185. } else {
  1186. me.currentOprParent = 0;
  1187. me.currentCache = me.getCache();
  1188. }
  1189. //me.showGljItems(me.gljList, gljTypeId);
  1190. me.showGljItems(me.currentCache, gljTypeId);
  1191. },
  1192. beforeRename: function(treeId, treeNode, newName, isCancel) {
  1193. if (newName.length == 0) {
  1194. return false;
  1195. }
  1196. return true;
  1197. },
  1198. onRename : function(e, treeId, treeNode, isCancel) {
  1199. let nodes = [];
  1200. nodes.push(treeNode);
  1201. gljTypeTreeOprObj.updateNodes(nodes);
  1202. },
  1203. onBeforeRemove: function(treeId, treeNode){
  1204. let me = this;
  1205. if (treeNode.ParentID == -1 && treeNode.isFirstNode) {
  1206. alert("不允许删除全部!");
  1207. return false;
  1208. }
  1209. if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
  1210. return false;
  1211. }
  1212. let nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
  1213. if (preNode) {
  1214. preNodeId = preNode.ID;
  1215. }
  1216. private_fetchAllSubItems = function(pItem){
  1217. nodeIds.push(pItem.ID);
  1218. if (pItem.items && pItem.items.length > 0) {
  1219. for (let i = 0; i < pItem.items.length; i++) {
  1220. private_fetchAllSubItems(pItem.items[i]);
  1221. }
  1222. }
  1223. };
  1224. nodeIds.push(treeNode.ID);
  1225. for (let i = 0; i < treeNode.items.length; i++) {
  1226. private_fetchAllSubItems(treeNode.items[i]);
  1227. }
  1228. $.ajax({
  1229. type:"POST",
  1230. url:"api/deleteGljNodes",
  1231. data:{"repId": pageOprObj.gljLibId, "lastOpr": userAccount, "nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
  1232. dataType:"json",
  1233. cache:false,
  1234. timeout:5000,
  1235. success:function(result,textStatus,status){
  1236. let pNode = treeNode.getParentNode();
  1237. if (pNode && pNode.items && pNode.items.length == 1) {
  1238. pNode.isParent = false;
  1239. }
  1240. },
  1241. error:function(){
  1242. }
  1243. });
  1244. return true;
  1245. },
  1246. onRemove: function(e, treeId, treeNode){
  1247. let me = repositoryGljObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  1248. if (pNode && pNode.items && pNode.items.length == 0) {
  1249. pNode.isParent = false;
  1250. me.treeObj.refresh();
  1251. }
  1252. },
  1253. updateNodes: function(nodes){
  1254. if (nodes && nodes.length > 0) {
  1255. let reqData = []
  1256. for (let i = 0; i < nodes.length; i++) {
  1257. let node = {};
  1258. node.repositoryId = nodes[i].repositoryId;
  1259. node.ID = nodes[i].ID;
  1260. node.ParentID = nodes[i].ParentID;
  1261. node.NextSiblingID = nodes[i].NextSiblingID;
  1262. node.Name = nodes[i].Name;
  1263. reqData.push(node);
  1264. }
  1265. $.ajax({
  1266. type:"POST",
  1267. url:"api/updateGljNodes",
  1268. data:{"repId": pageOprObj.gljLibId, "lastOpr": userAccount, "nodes": JSON.stringify(reqData)},
  1269. dataType:"json",
  1270. cache:false,
  1271. timeout:5000,
  1272. success:function(result,textStatus,status){
  1273. console.log(status + ' : ' + result);
  1274. },
  1275. error:function(){
  1276. }
  1277. })
  1278. }
  1279. },
  1280. addRootNode: function() {
  1281. let me = repositoryGljObj, rawNode = {ParentID: -1, NextSiblingID: -1, Name: "所有"}, lastNodeId = -1;
  1282. if (me.treeObj) {
  1283. let rootNodes = me.treeObj.getNodes();
  1284. if (rootNodes.length == 0) {
  1285. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  1286. if (!(err)) {
  1287. let newNodes = [], isSilent = false;
  1288. newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"所有",isParent:false, items:[]});
  1289. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  1290. }
  1291. });
  1292. }
  1293. }
  1294. },
  1295. addNewNode : function(rawNode, lastNodeId, callback){
  1296. $.ajax({
  1297. type:"POST",
  1298. url:"api/createNewGljTypeNode",
  1299. data:{"lastOpr": userAccount, "repositoryId": repositoryGljObj.currentRepositoryId,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
  1300. dataType:"json",
  1301. cache:false,
  1302. timeout:1000,
  1303. success: function(result,textStatus,status){
  1304. callback(false, result);
  1305. },
  1306. error:function(err){
  1307. callback(err);
  1308. }
  1309. })
  1310. },
  1311. addHoverDom: function(treeId, treeNode) {
  1312. if(typeof treeNode.doing !== 'undefined' && treeNode.doing){
  1313. return false;
  1314. }
  1315. hoverOpr();
  1316. function hoverOpr(){
  1317. let me = repositoryGljObj, sObj = $("#" + treeNode.tId + "_span");
  1318. if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
  1319. let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
  1320. sObj.after(addStr);
  1321. let btn = $("#addBtn_"+treeNode.tId);
  1322. if (btn) btn.bind("click", function(){
  1323. treeNode.doing = true;
  1324. let rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, Name: "新增子节点"}, lastNodeId = -1;
  1325. if (treeNode.items.length > 0) {
  1326. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  1327. }
  1328. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  1329. if (!(err)) {
  1330. let newNodes = [], isSilent = false;
  1331. if(treeNode.items.length > 0){
  1332. treeNode.items[treeNode.items.length - 1].NextSiblingID = rst.data.ID;
  1333. }
  1334. newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"新增子节点",isParent:false, items:[]});
  1335. treeNode.isParent = true;
  1336. if (me.treeObj) {
  1337. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  1338. } else {
  1339. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), gljSetting, newNodes);
  1340. }
  1341. treeNode.doing = false;
  1342. hoverOpr();
  1343. }
  1344. });
  1345. });
  1346. }
  1347. },
  1348. removeHoverDom: function(treeId, treeNode) {
  1349. $("#addBtn_"+treeNode.tId).unbind().remove();
  1350. }
  1351. };
  1352. //export {repositoryGljObj};//测试用