glj_view_contextMenu.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  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 subSpread.getActiveSheet().name()=='rationInstallSheet';
  374. }
  375. },
  376. "apply_to_FB": {
  377. name: '应用到当前分部',
  378. icon: 'fa-sign-in',
  379. disabled: function () {
  380. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  381. let sheetData = installationFeeObj.rationInstallData;
  382. if(gljContextMenu.selectedRow>sheetData.length-1){
  383. return true;
  384. }
  385. if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
  386. return true;
  387. }
  388. }
  389. return false;
  390. },
  391. callback: function () {
  392. installationFeeObj.applyRuleTo('FB',gljContextMenu.selectedRow);
  393. },
  394. visible: function(key, opt){
  395. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  396. }
  397. },
  398. "apply_to_PRO": {
  399. name: '应用到当前项目',
  400. icon: 'fa-sign-in',
  401. disabled: function () {
  402. if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
  403. let sheetData = installationFeeObj.rationInstallData;
  404. if(gljContextMenu.selectedRow>sheetData.length-1){
  405. return true;
  406. }
  407. if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
  408. return true;
  409. }
  410. }
  411. return false;
  412. },
  413. callback: function () {
  414. installationFeeObj.applyRuleTo('PJ',gljContextMenu.selectedRow);
  415. },
  416. visible: function(key, opt){
  417. return subSpread.getActiveSheet().name()=='rationInstallSheet';
  418. }
  419. }
  420. }
  421. });
  422. },
  423. onbuild:function ($trigger, e) {
  424. var target = SheetDataHelper.safeRightClickSelection($trigger, e, subSpread);
  425. gljContextMenu.selectedRow = target.row;
  426. gljContextMenu.selectedCol = target.col;
  427. if(subSpread.getActiveSheet().name() == 'ration_glj'){
  428. gljOprObj.sheetInitSelection({row: target.row, col: target.col});
  429. }
  430. //controller.setTreeSelected(controller.tree.items[target.row]);
  431. return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  432. },
  433. initGLJSelectView: function () {
  434. if (gljOprObj.gljLibSpresd == undefined) {
  435. gljOprObj.gljLibSpresd = sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length + gljOprObj.complementaryGLJs.length);
  436. sheetCommonObj.spreadDefaultStyle(gljOprObj.gljLibSpresd);
  437. gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked, gljOprObj.onButtonClick);
  438. gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
  439. gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, gljOprObj.onSelectionChanged);
  440. gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, _.debounce(gljOprObj.onTopRowChanged, 100));
  441. gljOprObj.gljLibSheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
  442. gljOprObj.gljLibSheet.options.isProtected = true;
  443. gljOprObj.gljLibSheet.name('glj_lib');
  444. sheetCommonObj.setSheetBySetting(gljOprObj.gljLibSheet, gljOprObj.gljLibSheetSetting);
  445. }
  446. let gljClass = 0,
  447. selected,
  448. connect_key;
  449. const actionType = $('#actionType').val();
  450. const addActions = ['add', 'insert', 'addMix','unitPriceAddMix'];
  451. const replaceActions = ['m_replace', 'replace'];
  452. if (addActions.includes(actionType)) {//插入,添加,添加组成物(项目人材机页面)
  453. gljOprObj.GLJSelection = [];
  454. } else if(replaceActions.includes(actionType)){//替换、批量替换
  455. selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
  456. connect_key = gljOprObj.getIndex(selected, gljKeyArray);
  457. gljOprObj.GLJSelection = [connect_key];
  458. // 找到定位的分类树
  459. const locatedItem = gljOprObj.AllRecode.find(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
  460. if (locatedItem) {
  461. gljClass = locatedItem.gljClass;
  462. locatedItem.select = 1;
  463. }
  464. }
  465. //替换,焦点定位至当前选中人材机
  466. if (replaceActions.includes(actionType)) {
  467. gljOprObj.locateZTree(gljClass);
  468. sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
  469. const index = gljOprObj.AllRecode.findIndex(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
  470. gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
  471. gljOprObj.gljLibSheet.setActiveCell(index, 0);
  472. gljOprObj.initSelection({row: index});
  473. gljOprObj.gljLibSpresd.focus(true);
  474. } else if (actionType === 'add' || actionType === 'insert' || actionType === 'addMix'|| actionType === 'unitPriceAddMix') {
  475. gljOprObj.locateZTree(null);
  476. sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
  477. gljOprObj.gljLibSheet.showRow(0, GC.Spread.Sheets.VerticalPosition.top);
  478. gljOprObj.gljLibSheet.setActiveCell(0, 0);
  479. gljOprObj.initSelection({row: 0});
  480. } else {
  481. gljOprObj.showLibGLJSheetData();
  482. }
  483. }
  484. }
  485. function getGLJData(actionType,getLibFunc, initLibs, gljLibID) {
  486. if (actionType === 'change') {
  487. actionType = $('#actionType').val();
  488. }
  489. $('#actionType').val(actionType);
  490. // 清除选中人材机缓存数据
  491. gljOprObj.GLJSelection = [];
  492. $.bootstrapLoading.start();
  493. let location = false;
  494. // 需要定位
  495. const locateActions = ['replace', 'm_replace'];
  496. if (locateActions.includes(actionType)) {
  497. location = true;
  498. }
  499. const init = true;
  500. const reset = true;
  501. const condition = gljOprObj.getPagingCondition(init, reset, location, 0, initLibs, gljLibID);
  502. if(!getLibFunc)getLibFunc = projectObj.project.ration_glj.getGLJDataPaging;
  503. getLibFunc(condition, function (gljData, result) {
  504. if (gljOprObj.treeData.std.length) {
  505. gljOprObj.initClassTree(gljOprObj.treeData.std);
  506. } else if (gljOprObj.treeData.comple.length) {
  507. gljOprObj.initClassTree(gljOprObj.treeData.comple);
  508. }
  509. if (initLibs) {
  510. initLibOptions(result.libData);
  511. $('#modalCon').width($(window).width()*0.5);
  512. if(actionType == "m_replace"){
  513. $('#glj_selected_conf').hide();
  514. $('#replace_next_btn').show();
  515. } else {
  516. $('#glj_selected_conf').show();
  517. $('#replace_next_btn').hide();
  518. }
  519. $("#glj_tree_div").modal({show:true});
  520. setTimeout(function(){
  521. gljOprObj.gljLibSpresd ? gljOprObj.gljLibSpresd.refresh() : '';
  522. }, 200);
  523. } else {
  524. gljContextMenu.initGLJSelectView();
  525. }
  526. $.bootstrapLoading.end();
  527. });
  528. }
  529. function initLibOptions(libData) {
  530. const html = libData.reduce((acc, lib) => acc += `<option ${lib.isDefault ? 'selected="selected"' : ''} value="${lib.gljLibId}">${lib.name}</option>`, '');
  531. $('#glj-lib-select').html(html);
  532. }
  533. function showGLJClassTree(record) {
  534. let engineerID = projectObj.project.projectInfo.property.engineering_id;
  535. CommonAjax.post('/rationGlj/getGLJClass/'+engineerID,record, function (data) {
  536. if(data.exist==true){
  537. alert("当前人材机已存在。");
  538. }else {
  539. gljOprObj.selectedGLJClass = record;
  540. $("#glj_class_div").modal({show:true});
  541. zTreeHelper.createTree(data.items, gljOprObj.gljTreeSetting, "classTree", gljOprObj);
  542. }
  543. })
  544. }