glj_view_contextMenu.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. /**
  2. * Created by chen on 2017/7/25.
  3. */
  4. var gljContextMenu = {
  5. selectedRow :null,
  6. selectedCol:null,
  7. clipboard:null,
  8. loadGLJSpreadContextMenu: function () {
  9. $.contextMenu({
  10. selector: '#subSpread',
  11. build: this.onbuild,
  12. items: {
  13. "replace_glj": {
  14. name: '替换',
  15. icon: 'fa-sign-in',
  16. disabled: function () {
  17. var sheetData = gljOprObj.sheetData;
  18. const selected = projectObj.project.mainTree.selected;
  19. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  20. return true;
  21. }
  22. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  23. if(sheetData[gljContextMenu.selectedRow].isMixRatio==true){
  24. return true;
  25. }
  26. return false;
  27. }
  28. return true;
  29. },
  30. callback: function () {
  31. getGLJData('replace', null, true, null);
  32. },
  33. visible: function(key, opt){
  34. return subSpread.getActiveSheet().name()=='ration_glj';
  35. }
  36. },
  37. "add_glj": {
  38. name: '添加',
  39. icon: 'fa-sign-in',
  40. disabled: function () {
  41. var selected = projectObj.project.mainTree.selected;
  42. var sheetData = gljOprObj.sheetData;
  43. if(selected){
  44. if(selected.sourceType!=ModuleNames.ration){
  45. return true;
  46. }else if(selected.data.type!=rationType.ration){
  47. return true;
  48. }
  49. }
  50. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  51. if(sheetData[gljContextMenu.selectedRow].isMixRatio==true){
  52. return true;
  53. }
  54. }
  55. return false;
  56. },
  57. callback:function () {
  58. getGLJData('add', null, true, null);
  59. },
  60. visible: function(key, opt){
  61. return subSpread.getActiveSheet().name()=='ration_glj';
  62. }
  63. },
  64. "delete_glj": {
  65. name: '删除',
  66. icon: 'fa-remove',
  67. disabled: function () {
  68. var sheetData = gljOprObj.sheetData;
  69. const selected = projectObj.project.mainTree.selected;
  70. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  71. return true;
  72. }
  73. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  74. if( sheetData[gljContextMenu.selectedRow].isMixRatio==true){
  75. return true;
  76. }
  77. return false;
  78. }else {
  79. return true;
  80. }
  81. },
  82. callback: function () {
  83. var sheetData = gljOprObj.sheetData;
  84. var deleteRow = sheetData[gljContextMenu.selectedRow];
  85. projectObj.project.ration_glj.updataOrdelete(deleteRow);
  86. },
  87. visible: function(key, opt){
  88. return subSpread.getActiveSheet().name()=='ration_glj';
  89. }
  90. },
  91. "m_replace_glj": {
  92. name: '批量替换',
  93. icon: 'fa-sign-in',
  94. disabled: function () {
  95. let sheetData = gljOprObj.sheetData;
  96. const selected = projectObj.project.mainTree.selected;
  97. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  98. return true;
  99. }
  100. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  101. if(sheetData[gljContextMenu.selectedRow].isMixRatio==true){
  102. return true;
  103. }
  104. return false;
  105. }
  106. return true;
  107. },
  108. callback: function () {
  109. getGLJData('m_replace', null, true, null);
  110. },
  111. visible: function(key, opt){
  112. return subSpread.getActiveSheet().name()=='ration_glj';
  113. }
  114. },
  115. "addMixRatio": {
  116. name: '添加组成物',
  117. icon: 'fa-sign-in',
  118. disabled: function () {
  119. let sheetData = gljOprObj.sheetData;
  120. const selected = projectObj.project.mainTree.selected;
  121. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  122. return true;
  123. }
  124. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  125. if(sheetData[gljContextMenu.selectedRow].isMixRatio == true) return false;
  126. if(!sheetData[gljContextMenu.selectedRow].subList) return true;
  127. return false;
  128. }
  129. return true;
  130. },
  131. callback: function () {
  132. let t = gljOprObj.sheetData[gljContextMenu.selectedRow];
  133. if(t.isMixRatio){
  134. projectGljObject.selectedProjectGLJ = t.parentGLJ;
  135. for(let rg of gljOprObj.sheetData){
  136. if(rg.projectGLJID == t.parentGLJ.id) {
  137. projectGljObject.subList = rg.subList;
  138. break;
  139. }
  140. }
  141. }else{
  142. projectGljObject.selectedProjectGLJ = t;
  143. projectGljObject.subList = t.subList;
  144. }
  145. getGLJData('addMix', null, true, null);
  146. },
  147. visible: function(key, opt){
  148. return subSpread.getActiveSheet().name()=='ration_glj';
  149. }
  150. },
  151. "deleteMixRatio": {
  152. name: '删除组成物',
  153. icon: 'fa-sign-in',
  154. disabled: function () {
  155. let sheetData = gljOprObj.sheetData;
  156. const selected = projectObj.project.mainTree.selected;
  157. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  158. return true;
  159. }
  160. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  161. if(sheetData[gljContextMenu.selectedRow].isMixRatio == true) return false;
  162. }
  163. return true;
  164. },
  165. callback: function () {
  166. gljOprObj.deleteRatio(gljContextMenu.selectedRow);
  167. },
  168. visible: function(key, opt){
  169. return subSpread.getActiveSheet().name()=='ration_glj';
  170. }
  171. },
  172. "add_to_lib": {
  173. name: '保存到我的人材机库',
  174. icon: 'fa-sign-in',
  175. disabled: function () {
  176. var sheetData = gljOprObj.sheetData;
  177. const selected = projectObj.project.mainTree.selected;
  178. if(gljOprObj.isInstallationNode(selected) || OVER_HEIGHT.isOverHeight(selected)){
  179. return true;
  180. }
  181. if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
  182. var recode = sheetData[gljContextMenu.selectedRow];
  183. if(!(recode.isMixRatio!=true&&recode.isAdd==true)){
  184. return true
  185. }
  186. return false;
  187. // disable= recode.isMixRatio!=true&&recode.isAdd==true?false:true
  188. }
  189. return true;
  190. },
  191. callback: function () {
  192. var sheetData = gljOprObj.sheetData;
  193. var recode = sheetData[gljContextMenu.selectedRow];
  194. showGLJClassTree(recode);
  195. },
  196. visible: function(key, opt){
  197. return subSpread.getActiveSheet().name()=='ration_glj';
  198. }
  199. },
  200. "insert_detail": {
  201. name: '插入行',
  202. icon: 'fa-sign-in',
  203. disabled: function () {
  204. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  205. var sheetData = gljOprObj.detailData;
  206. if(gljOprObj.detailSheetReadonly()){
  207. return true
  208. }else {
  209. return gljContextMenu.selectedRow>sheetData.length;
  210. }
  211. }
  212. return false
  213. },
  214. callback: function () {
  215. projectObj.project.quantity_detail.insertQuantityDetail(gljContextMenu.selectedRow);
  216. },
  217. visible: function(key, opt){
  218. return subSpread.getActiveSheet().name()=='quantity_detail';
  219. }
  220. },
  221. "delete_detail": {
  222. name: '删除行',
  223. icon: 'fa-remove',
  224. disabled: function () {
  225. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  226. var sheetData = gljOprObj.detailData;
  227. return gljContextMenu.selectedRow>sheetData.length-1;
  228. }
  229. return false
  230. },
  231. callback:function () {
  232. projectObj.project.quantity_detail.deleteQuantityDetail(gljContextMenu.selectedRow);
  233. },
  234. visible: function(key, opt){
  235. return subSpread.getActiveSheet().name()=='quantity_detail';
  236. }
  237. },
  238. "move_up": {
  239. name: '上移',
  240. icon: 'fa-arrow-up',
  241. disabled: function () {
  242. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  243. var sheetData = gljOprObj.detailData;
  244. return gljContextMenu.selectedRow==0||gljContextMenu.selectedRow>sheetData.length-1;
  245. }
  246. return false;
  247. },
  248. callback: function () {
  249. projectObj.project.quantity_detail.moveUp(gljContextMenu.selectedRow);
  250. },
  251. visible: function(key, opt){
  252. return subSpread.getActiveSheet().name()=='quantity_detail';
  253. }
  254. },
  255. "move_down": {
  256. name: '下移',
  257. icon: 'fa-arrow-down',
  258. disabled: function () {
  259. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  260. var sheetData = gljOprObj.detailData;
  261. return gljContextMenu.selectedRow>sheetData.length-2;
  262. }
  263. return false;
  264. },
  265. callback: function () {
  266. projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
  267. },
  268. visible: function(key, opt){
  269. return subSpread.getActiveSheet().name()=='quantity_detail';
  270. }
  271. },
  272. "copy": {
  273. name: '复制',
  274. icon: 'fa-files-o',
  275. disabled: function () {
  276. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  277. let sheet = subSpread.getActiveSheet();
  278. let sheetData = gljOprObj.detailData;
  279. let value = sheet.getCell(gljContextMenu.selectedRow,gljContextMenu.selectedCol).value();
  280. if(gljContextMenu.selectedRow>sheetData.length-1||value==null){
  281. return true;
  282. }
  283. if(gljOprObj.detailSetting.header[gljContextMenu.selectedCol].dataCode == 'isSummation'){//累加列恢显
  284. return true;
  285. }
  286. }
  287. return false;
  288. },
  289. callback: function () {
  290. gljContextMenu.clipboard={
  291. row:gljContextMenu.selectedRow,
  292. col:gljContextMenu.selectedCol
  293. };
  294. },
  295. visible: function(key, opt){
  296. return subSpread.getActiveSheet().name()=='quantity_detail';
  297. }
  298. },
  299. "paste": {
  300. name: '粘贴',
  301. icon: 'fa-clipboard',
  302. disabled: function () {
  303. if(subSpread.getActiveSheet().name()=='quantity_detail'){
  304. let sheetData = gljOprObj.detailData;
  305. let dataCode = gljOprObj.detailSetting.header[gljContextMenu.selectedCol].dataCode;
  306. if(gljContextMenu.selectedRow>sheetData.length||gljContextMenu.clipboard==null){
  307. return true;
  308. }
  309. //结果列和累加列灰显
  310. if(dataCode == 'result' || dataCode == 'isSummation'){
  311. return true;
  312. }
  313. }
  314. return false;
  315. },
  316. callback: function () {
  317. var sheet = subSpread.getActiveSheet();
  318. var c=gljContextMenu.clipboard;
  319. console.log(sheet.getCell(c.row,c.col).value());
  320. var args={
  321. 'row':gljContextMenu.selectedRow,
  322. 'col':gljContextMenu.selectedCol,
  323. 'editingText':sheet.getCell(c.row,c.col).value()
  324. }
  325. gljOprObj.onEditDetailSheet(args);
  326. },
  327. visible: function(key, opt){
  328. return subSpread.getActiveSheet().name()=='quantity_detail';
  329. }
  330. },
  331. "modify_rule": {
  332. name: '修改规则',
  333. icon: 'fa-sign-in',
  334. disabled: function () {//当选中空行或者ruleID为空的情况下,灰显
  335. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  336. let sheetData = installationFeeObj.rationInstallData;
  337. if(gljContextMenu.selectedRow>sheetData.length-1){
  338. return true
  339. }
  340. let ri = sheetData[gljContextMenu.selectedRow];
  341. if(!ri.ruleId||ri.ruleId==''){
  342. return true;
  343. }
  344. }
  345. return false;
  346. },
  347. callback: function () {
  348. $("#modify_feeRule").modal({show:true});
  349. },
  350. visible: function(key, opt){
  351. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  352. }
  353. },
  354. "apply_to_FX": {
  355. name: '应用到当前分项',
  356. icon: 'fa-sign-in',
  357. disabled: function () {
  358. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  359. let sheetData = installationFeeObj.rationInstallData;
  360. if(gljContextMenu.selectedRow>sheetData.length-1){
  361. return true;
  362. }
  363. if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
  364. return true;
  365. }
  366. }
  367. return false;
  368. },
  369. callback: function () {
  370. installationFeeObj.applyRuleTo('FX',gljContextMenu.selectedRow);
  371. },
  372. visible: function(key, opt){
  373. return false
  374. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  375. }
  376. },
  377. "apply_to_FB": {
  378. name: '应用到当前分部',
  379. icon: 'fa-sign-in',
  380. disabled: function () {
  381. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  382. let sheetData = installationFeeObj.rationInstallData;
  383. if(gljContextMenu.selectedRow>sheetData.length-1){
  384. return true;
  385. }
  386. if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
  387. return true;
  388. }
  389. }
  390. return false;
  391. },
  392. callback: function () {
  393. installationFeeObj.applyRuleTo('FB',gljContextMenu.selectedRow);
  394. },
  395. visible: function(key, opt){
  396. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  397. }
  398. },
  399. "apply_to_PRO": {
  400. name: '应用到当前项目',
  401. icon: 'fa-sign-in',
  402. disabled: function () {
  403. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  404. let sheetData = installationFeeObj.rationInstallData;
  405. if(gljContextMenu.selectedRow>sheetData.length-1){
  406. return true;
  407. }
  408. if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
  409. return true;
  410. }
  411. }
  412. return false;
  413. },
  414. callback: function () {
  415. installationFeeObj.applyRuleTo('PJ',gljContextMenu.selectedRow);
  416. },
  417. visible: function(key, opt){
  418. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  419. }
  420. }
  421. }
  422. });
  423. },
  424. onbuild:function ($trigger, e) {
  425. var target = SheetDataHelper.safeRightClickSelection($trigger, e, subSpread);
  426. gljContextMenu.selectedRow = target.row;
  427. gljContextMenu.selectedCol = target.col;
  428. if(subSpread.getActiveSheet().name() == 'ration_glj'){
  429. gljOprObj.sheetInitSelection({row: target.row, col: target.col});
  430. }
  431. //controller.setTreeSelected(controller.tree.items[target.row]);
  432. return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  433. },
  434. initGLJSelectView: function () {
  435. if (gljOprObj.gljLibSpresd == undefined) {
  436. gljOprObj.gljLibSpresd = sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length + gljOprObj.complementaryGLJs.length);
  437. sheetCommonObj.spreadDefaultStyle(gljOprObj.gljLibSpresd);
  438. gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked, gljOprObj.onButtonClick);
  439. gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
  440. gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, gljOprObj.onSelectionChanged);
  441. gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, _.debounce(gljOprObj.onTopRowChanged, 100));
  442. gljOprObj.gljLibSheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
  443. gljOprObj.gljLibSheet.options.isProtected = true;
  444. gljOprObj.gljLibSheet.name('glj_lib');
  445. sheetCommonObj.setSheetBySetting(gljOprObj.gljLibSheet, gljOprObj.gljLibSheetSetting);
  446. }
  447. let gljClass = 0,
  448. selected,
  449. connect_key;
  450. const actionType = $('#actionType').val();
  451. const addActions = ['add', 'insert', 'addMix','unitPriceAddMix'];
  452. const replaceActions = ['m_replace', 'replace'];
  453. if (addActions.includes(actionType)) {//插入,添加,添加组成物(项目人材机页面)
  454. gljOprObj.GLJSelection = [];
  455. } else if(replaceActions.includes(actionType)){//替换、批量替换
  456. selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
  457. connect_key = gljOprObj.getIndex(selected, gljKeyArray);
  458. gljOprObj.GLJSelection = [connect_key];
  459. // 找到定位的分类树
  460. const locatedItem = gljOprObj.AllRecode.find(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
  461. if (locatedItem) {
  462. gljClass = locatedItem.gljClass;
  463. locatedItem.select = 1;
  464. }
  465. }
  466. //替换,焦点定位至当前选中人材机
  467. if (replaceActions.includes(actionType)) {
  468. gljOprObj.locateZTree(gljClass);
  469. sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
  470. const index = gljOprObj.AllRecode.findIndex(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
  471. gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
  472. gljOprObj.gljLibSheet.setActiveCell(index, 0);
  473. gljOprObj.initSelection({row: index});
  474. gljOprObj.gljLibSpresd.focus(true);
  475. } else if (actionType === 'add' || actionType === 'insert' || actionType === 'addMix'|| actionType === 'unitPriceAddMix') {
  476. gljOprObj.locateZTree(null);
  477. sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
  478. gljOprObj.gljLibSheet.showRow(0, GC.Spread.Sheets.VerticalPosition.top);
  479. gljOprObj.gljLibSheet.setActiveCell(0, 0);
  480. gljOprObj.initSelection({row: 0});
  481. } else {
  482. gljOprObj.showLibGLJSheetData();
  483. }
  484. }
  485. }
  486. function getGLJData(actionType,getLibFunc, initLibs, gljLibID) {
  487. if (actionType === 'change') {
  488. actionType = $('#actionType').val();
  489. }
  490. $('#actionType').val(actionType);
  491. // 清除选中人材机缓存数据
  492. gljOprObj.GLJSelection = [];
  493. $.bootstrapLoading.start();
  494. let location = false;
  495. // 需要定位
  496. const locateActions = ['replace', 'm_replace'];
  497. if (locateActions.includes(actionType)) {
  498. location = true;
  499. }
  500. const init = true;
  501. const reset = true;
  502. const condition = gljOprObj.getPagingCondition(init, reset, location, 0, initLibs, gljLibID);
  503. if(!getLibFunc)getLibFunc = projectObj.project.ration_glj.getGLJDataPaging;
  504. getLibFunc(condition, function (gljData, result) {
  505. if (gljOprObj.treeData.std.length) {
  506. gljOprObj.initClassTree(gljOprObj.treeData.std);
  507. } else if (gljOprObj.treeData.comple.length) {
  508. gljOprObj.initClassTree(gljOprObj.treeData.comple);
  509. }
  510. if (initLibs) {
  511. initLibOptions(result.libData);
  512. $('#modalCon').width($(window).width()*0.5);
  513. if(actionType == "m_replace"){
  514. $('#glj_selected_conf').hide();
  515. $('#replace_next_btn').show();
  516. } else {
  517. $('#glj_selected_conf').show();
  518. $('#replace_next_btn').hide();
  519. }
  520. $("#glj_tree_div").modal({show:true});
  521. setTimeout(function(){
  522. gljOprObj.gljLibSpresd ? gljOprObj.gljLibSpresd.refresh() : '';
  523. }, 200);
  524. } else {
  525. gljContextMenu.initGLJSelectView();
  526. }
  527. $.bootstrapLoading.end();
  528. });
  529. }
  530. function initLibOptions(libData) {
  531. const html = libData.reduce((acc, lib) => acc += `<option ${lib.isDefault ? 'selected="selected"' : ''} value="${lib.gljLibId}">${lib.name}</option>`, '');
  532. $('#glj-lib-select').html(html);
  533. }
  534. function showGLJClassTree(record) {
  535. let engineerID = projectObj.project.projectInfo.property.engineering_id;
  536. CommonAjax.post('/rationGlj/getGLJClass/'+engineerID,record, function (data) {
  537. if(data.exist==true){
  538. alert("当前人材机已存在。");
  539. }else {
  540. gljOprObj.selectedGLJClass = record;
  541. $("#glj_class_div").modal({show:true});
  542. zTreeHelper.createTree(data.items, gljOprObj.gljTreeSetting, "classTree", gljOprObj);
  543. }
  544. })
  545. }