fee_rate_view.js 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  1. /**
  2. * Created by chen on 2017/8/1.
  3. */
  4. var feeRateObject={
  5. mainFeeRateSpread:null,
  6. mainFeeRateSheet:null,
  7. mainFeeRateData:null,
  8. feeRateSTDList:[],
  9. mainFeeRateSetting:{
  10. header: [
  11. {headerName: "专业名称", headerWidth: 250, dataCode: "name", dataType: "String"},
  12. {headerName: "值%", headerWidth: 80, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
  13. {headerName: "备注", headerWidth: 150, dataCode: "memo", dataType: "String", showHint: true}
  14. ],
  15. view: {
  16. lockColumns: [0]
  17. }
  18. },
  19. mainViews:null,
  20. datas:null,
  21. datasBackup:null,
  22. canEdit:false,
  23. activateFeeRate:null,
  24. needCascadeSet:false,
  25. selectionLoad:false,
  26. changeInfo:null,
  27. feeRateSpreads:null,
  28. editingCell:null,
  29. feeRateSelection:null,
  30. sheetSetting: {
  31. header: [
  32. {headerName: "专业名称", headerWidth: 200, dataCode: "name", dataType: "String"},
  33. {headerName: "值%", headerWidth: 120, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
  34. {headerName: "备注", dataCode: "memo", dataType: "String", showHint: true}
  35. ],
  36. view: {
  37. comboBox: [],
  38. lockColumns: [0, 1, 2]
  39. }
  40. },
  41. columns: [
  42. {
  43. id: 'name',
  44. caption: '专业名称',
  45. dataField: 'name',
  46. width: 450,
  47. allowEditing: false
  48. },
  49. {
  50. id: 'rate',
  51. caption: '值%',
  52. dataField: 'rate',
  53. width: 120,
  54. minWidth: 50,
  55. allowEditing: true
  56. },
  57. {
  58. id: 'memo',
  59. caption: '备注',
  60. dataField: 'memo',
  61. minWidth: 120,
  62. allowEditing: true
  63. },
  64. {
  65. id: 'ID',
  66. caption: 'ID',
  67. dataField: 'ID',
  68. width: 80,
  69. visible: false,
  70. allowEditing: false
  71. },
  72. {
  73. id: 'subFeeRate',
  74. caption: '子费率',
  75. dataField: 'subFeeRate',
  76. width: 80,
  77. visible: false,
  78. allowEditing: false
  79. },
  80. {
  81. id: '_id',
  82. caption: '自动ID',
  83. dataField: '_id',
  84. width: 80,
  85. visible: false,
  86. allowEditing: false
  87. },
  88. {
  89. id: 'ParentID',
  90. caption: '父结点ID',
  91. dataField: 'ParentID',
  92. width: 80,
  93. visible: false,
  94. allowEditing: false
  95. }
  96. ],
  97. options :{
  98. allowSorting: false,
  99. showRowHeader: true,
  100. colMinWidth: 80,
  101. rowHeight: 30,
  102. allowEditing: true,
  103. editMode: 'inline',
  104. editUnit: 'cell',
  105. selectionUnit: "row",
  106. hierarchy: {
  107. keyField: 'ID',
  108. parentField: 'ParentID',
  109. collapsed: false,
  110. column: 'name'
  111. }
  112. },
  113. dataSource : {
  114. loadRange: function(params) {
  115. params.success(feeRateObject.datas);
  116. },
  117. update: function(params) {
  118. if(!params.hasOwnProperty('sourceIndex')){
  119. var selected = feeRateObject.mainViews.getSelections()[0];
  120. params.sourceIndex = selected.sourceRow;
  121. }
  122. params.success();
  123. if(!$('#cascadeSet').prop('checked')||params.hasOwnProperty('viewIndex')){
  124. projectObj.project.FeeRate.updateFeeRateByEdit(params,feeRateObject.activateFeeRate);
  125. }
  126. }
  127. },
  128. createSheet:function(){
  129. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  130. feeRateObject.feeRateSpreads=sheetCommonObj.buildSheet($('#fee_rate_sheet')[0], feeRateObject.sheetSetting,feeRateFile.rates.length);
  131. sheetCommonObj.spreadDefaultStyle(feeRateObject.feeRateSpreads);
  132. feeRateObject.feeRateSheet = feeRateObject.feeRateSpreads.getSheet(0);
  133. feeRateObject.feeRateSheet.selectionUnit(1)//0 cell,1 row,2 col;
  134. feeRateObject.feeRateSheet.options.isProtected = true;
  135. feeRateObject.feeRateSheet.name('fee_rate');
  136. feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellClick,feeRateObject.onCellClick);
  137. feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick);
  138. },
  139. showFeeRateTree:function (sheet,setting,data) {
  140. let ch = GC.Spread.Sheets.SheetArea.viewport;
  141. let parentMap=_.groupBy(data, 'ParentID');
  142. let visibleMap = {};
  143. sheet.suspendPaint();
  144. sheet.suspendEvent();
  145. sheet.setRowCount(data.length);
  146. for (let col = 0; col < setting.header.length; col++) {
  147. let hAlign = "left", vAlign = "center";
  148. if (setting.header[col].hAlign) {
  149. hAlign = setting.header[col].hAlign;
  150. } else if (setting.header[col].dataType !== "String"){
  151. hAlign = "right";
  152. }
  153. vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
  154. sheetCommonObj.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
  155. if (setting.header[col].formatter) {
  156. sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
  157. }
  158. if (setting.header[col].showHint) {
  159. sheet.getRange(-1, col, -1, 1).cellType(TREE_SHEET_HELPER.getTipCellType(setting));
  160. }
  161. for (let row = 0; row < data.length; row++) {
  162. let val = data[row][setting.header[col].dataCode];
  163. if(val&&setting.header[col].dataType === "Number"){
  164. if(setting.header[col].hasOwnProperty('decimalField')){
  165. let decimal = getDecimal(setting.header[col].decimalField);
  166. val =scMathUtil.roundToString(val,decimal);
  167. sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport);
  168. }else {
  169. val =scMathUtil.roundToString(val,2);
  170. }
  171. }
  172. sheet.setValue(row, col, val, ch);
  173. if(col==0){
  174. let treeType = sheetCommonObj.getTreeNodeCellType(data,row,parentMap);
  175. sheet.getCell(row, 0).cellType(treeType);
  176. visibleMap[data[row].ID] = treeType.collapsed;
  177. feeRateObject.setRowVisible(data,row,visibleMap,sheet);
  178. } else if (col === 1 && this.rateShouldMark(data[row], val)) {
  179. sheet.getCell(row, col).foreColor('red');
  180. }
  181. }
  182. }
  183. sheet.resumeEvent();
  184. sheet.resumePaint();
  185. },
  186. rateShouldMark: function (rateItem, val) {
  187. if (!rateItem) {
  188. return false;
  189. }
  190. if (rateItem.rate === null) {
  191. return false;
  192. }
  193. if (rateItem.sum) {
  194. return false;
  195. }
  196. if (rateItem.subFeeRate) {
  197. const selectedSubRate = rateItem.subFeeRate.recodes && rateItem.subFeeRate.recodes[0] ?
  198. rateItem.subFeeRate.recodes[0].optionList.find(item => item.selected)
  199. : null;
  200. if (!selectedSubRate) {
  201. return false;
  202. }
  203. const valInMap = rateItem.subFeeRate.valueMaps.find(item => item.ID === selectedSubRate.name);
  204. return !!(valInMap && valInMap.value !== +val);
  205. } else {
  206. return commonUtil.isDef(rateItem.originalRate) && rateItem.originalRate !== +val;
  207. }
  208. },
  209. setRowVisible:function (data,row,visibleMap,sheet) {
  210. sheet.getRange(row , -1, 1, -1).visible(getVisible(data[row].ParentID));//显示或隐藏
  211. function getVisible(ParentID) {
  212. if(visibleMap[ParentID]) return false //如果父节点是缩起的,那就隐藏本身。
  213. if(visibleMap[ParentID] == false){//如果父节点不是缩起的,要再往父节点找看
  214. let pnode = _.find(data,{'ID':ParentID});
  215. if(pnode) return getVisible(pnode.ParentID);//如果有父节点,递归调用
  216. return true;//没有,返回显示
  217. }
  218. }
  219. },
  220. getFeeRateLevel:function (rate,data) {
  221. if(rate.ParentID){
  222. let prate = _.find(data,{'ID':rate.ParentID});
  223. return this.getFeeRateLevel(prate,data) + 1;
  224. }else {
  225. return 0
  226. }
  227. },
  228. initFeeRateEditDiv:function(optionValue){//“0” 手工输入; “1” 选择费率
  229. let radioValue = optionValue,feeRateValue;
  230. if(!gljUtil.isDef(optionValue)){
  231. let fID = 0;
  232. if ($("#calc_program_manage").is(":visible")){
  233. fID = calcProgramManage.getSelectionInfo().calcItem.feeRateID;
  234. feeRateValue = calcProgramManage.getSelectionInfo().calcItem.feeRate;
  235. } else if ($("#zaojiashu").is(":visible")){
  236. fID = projectObj.project.mainTree.selected.data.feeRateID;
  237. feeRateValue = projectObj.project.mainTree.selected.data.feeRate;
  238. }
  239. radioValue = fID?"1":"0";
  240. $("#customFeeRate").val(feeRateValue);
  241. }
  242. $("input[name='editFeeRateOptions'][value='"+radioValue+"']").attr("checked",true);
  243. if(radioValue == "0"){
  244. $("#selfDiv").show();
  245. $("#fee_rate_sheet").hide();
  246. }else {
  247. $("#selfDiv").hide();
  248. $("#fee_rate_sheet").show();
  249. }
  250. },
  251. locate: function(){ // CSL,2018.07.18
  252. let sheet = feeRateObject.feeRateSpreads.getSheet(0);
  253. let fID = 0;
  254. if ($("#calc_program_manage").is(":visible"))
  255. fID = calcProgramManage.getSelectionInfo().calcItem.feeRateID;
  256. else if ($("#zaojiashu").is(":visible"))
  257. fID = projectObj.project.mainTree.selected.data.feeRateID;
  258. let rates = projectObj.project.FeeRate.getActivateFeeRate().rates;
  259. let rowIdx = 0, pID = 0;
  260. if (fID){
  261. fID = parseInt(fID);
  262. rowIdx = _.findIndex(rates,{ID:fID});
  263. if(rowIdx != -1) pID = rates[rowIdx].ParentID;
  264. }
  265. // 费率现有可能有多层节点,所以要递归展开父节点
  266. if(pID) expandParent(pID,rates,sheet);
  267. sheet.setSelection(rowIdx, -1, 1, -1);
  268. sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
  269. feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
  270. function expandParent(ID,datas,sheet) {//递归展开父节点
  271. let cellType = setCollapsed(ID);
  272. cellType.refreshChildrenVisible(sheet);
  273. function setCollapsed(parentID){
  274. let index = _.findIndex(datas,{'ID':parentID});
  275. let type = sheet.getCellType(index,0);
  276. type.collapsed = false;
  277. if(datas[index].ParentID){
  278. setCollapsed(datas[index].ParentID)
  279. }
  280. return type
  281. }
  282. }
  283. },
  284. getFeeRateEditCellType:function () {
  285. var ns = GC.Spread.Sheets;
  286. function FeeRateEditCellType() {
  287. var init=false;
  288. }
  289. FeeRateEditCellType.prototype = new ns.CellTypes.Text();
  290. //2018-12-12 按新需求隐藏费率选择按钮
  291. /* FeeRateEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
  292. GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
  293. if(feeRateObject.editingCell && !projectReadOnly){
  294. if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){
  295. var image = document.getElementById('f_btn'),imageMagin = 3;
  296. var imageHeight = h-2*imageMagin;
  297. var imageWidth = w*2/7;
  298. var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
  299. ctx.save();
  300. ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
  301. ctx.beginPath();
  302. ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
  303. ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
  304. ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
  305. ctx.fillStyle="black";//填充颜色,默认是黑色
  306. ctx.fill();//画实心圆
  307. ctx.closePath();
  308. ctx.restore();
  309. }
  310. }
  311. };
  312. FeeRateEditCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  313. return {
  314. x: x,
  315. y: y,
  316. row: context.row,
  317. col: context.col,
  318. cellStyle: cellStyle,
  319. cellRect: cellRect,
  320. sheetArea: context.sheetArea
  321. };
  322. };
  323. FeeRateEditCellType.prototype.processMouseDown = function (hitinfo) {
  324. let me=feeRateObject;
  325. if(me.editingCell && hitinfo.row==me.editingCell.row){
  326. var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
  327. var imageMagin=3;
  328. var imageHeight = hitinfo.cellRect.height-2*imageMagin;
  329. var imageWidth = hitinfo.cellRect.width*2/7;
  330. if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
  331. if(!projectReadOnly && me.ifFeeRateEdit(hitinfo.row,hitinfo.sheet.name())){
  332. $('#calcBaseFeeRateConf').attr('toggle', 'feeRate');
  333. changeCalcBaseFeeRate('feeRate');
  334. $('#tabFeeRate').tab('show');
  335. me.showSelectModal(hitinfo);
  336. }
  337. }else {//鼠标点击其它地方,消失
  338. hideButton(hitinfo);
  339. }
  340. }
  341. };
  342. FeeRateEditCellType.prototype.processMouseEnter = function (hitinfo){
  343. let me=feeRateObject;
  344. me.pmLeave = false;
  345. if(me.editingCell==null){
  346. var showSelectBtn = true;
  347. if(hitinfo.sheet.name()!='calc_detail'){
  348. showSelectBtn=me.ifFeeRateEdit(hitinfo.row,hitinfo.sheet.name());
  349. }
  350. if(showSelectBtn){
  351. me.editingCell={
  352. row:hitinfo.row,
  353. col:hitinfo.col
  354. };
  355. hitinfo.sheet.invalidateLayout();
  356. hitinfo.sheet.repaint();
  357. }
  358. }
  359. };
  360. FeeRateEditCellType.prototype.processMouseLeave = function (hitinfo) {
  361. hideButton(hitinfo);
  362. };
  363. function hideButton(hitinfo) {
  364. if(!feeRateObject.pmLeave){
  365. feeRateObject.editingCell=null;
  366. hitinfo.sheet.invalidateLayout();
  367. hitinfo.sheet.repaint();
  368. feeRateObject.pmLeave = true;
  369. }
  370. }*/
  371. return new FeeRateEditCellType();
  372. },
  373. showSelectModal:function (hitinfo) {
  374. //锁定的清单不显示
  375. let project = projectObj.project;
  376. if(project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
  377. return;
  378. }
  379. //$("#fee_rate_tree").modal({show:true});
  380. $("#calcBaseFeeRate").modal({show:true});
  381. $('#edit_from').val(hitinfo.sheet.name());
  382. },
  383. getChildrenCount:function (id,data) {
  384. var me=this;
  385. var sum=0;
  386. var children=_.filter(data,{'ParentID':id});
  387. if(children&&children.length==0){
  388. return 0;
  389. }
  390. for(var i=0;i<children.length;i++){
  391. sum+=me.getChildrenCount(children[i].ID,data);
  392. }
  393. return children.length+sum;
  394. },
  395. ifFeeRateEdit:function (row,name) {
  396. if( name == 'mainSheet'){
  397. var selected = projectObj.project.mainTree.items[row];
  398. return selected&&MainTreeCol.readOnly.forFeeRate(selected)?false:true;
  399. }
  400. return true;
  401. },
  402. createSpreadView:function () {
  403. if (this.mainViews) {
  404. this.mainViews.destroy();
  405. this.mainViews = null;
  406. }
  407. if(subRateObject.views){
  408. subRateObject.views.destroy();
  409. subRateObject.views = null;
  410. }
  411. this.activateFeeRate = projectObj.project.FeeRate.getActivateFeeRate();
  412. this.datas = this.activateFeeRate.rates;
  413. var rateColSetting = _.find(this.columns,{"id":"rate"});
  414. rateColSetting?rateColSetting.format=getFormatter(getDecimal("feeRate")):"";
  415. this.mainViews = new GC.Spread.Views.DataView($('#divFee')[0],
  416. this.dataSource, this.columns, new GC.Spread.Views.Plugins.GridLayout(this.options));
  417. this.mainViews["rowClick"].addHandler(subRateObject.reFreshRateViews);
  418. this.mainViews.invalidate();
  419. document.querySelector('#divFee').focus();
  420. },
  421. initFeeRateSpread:function (rowCount) {
  422. //初始化费用项表格
  423. this.mainFeeRateSpread = sheetCommonObj.buildSheet($('#divFee')[0], this.mainFeeRateSetting,rowCount);
  424. sheetCommonObj.spreadDefaultStyle(this.mainFeeRateSpread);
  425. this.mainFeeRateSpread.options.scrollbarMaxAlign = true;
  426. this.mainFeeRateSheet = this.mainFeeRateSpread.getSheet(0);
  427. if(!projectReadOnly){
  428. sheetCommonObj.lockCells(this.mainFeeRateSheet , this.mainFeeRateSetting);
  429. }
  430. this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMainFeeRateSheetValueChange);
  431. //this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onMainFeeRateSelectChanged);
  432. this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMainFeeRateRangeChanged);
  433. this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.EditStarting, function (e,args) {
  434. let me =feeRateObject;
  435. if($.bootstrapLoading.isLoading()) args.cancel = true;
  436. if(!me.mainFeeRateEditChecking(args.row,args.col)){
  437. args.cancel = true;
  438. }
  439. });
  440. this.mainFeeRateSheet.name('mainFeeRateSheet');
  441. disableRightMenu("divFee",this.mainFeeRateSpread,this.rightClickCallback);
  442. //打开他人分享的项目、只读
  443. if(projectReadOnly){
  444. sheetCommonObj.disableSpread(this.mainFeeRateSpread);
  445. }
  446. },
  447. rightClickCallback:function (row) {
  448. let me = feeRateObject;
  449. me.onMainFeeRateSelect(row);
  450. },
  451. showMainFeeRateData:function () {
  452. let me = this;
  453. let selected = me.mainFeeRateSheet.getSelections()[0];
  454. me.activateFeeRate = projectObj.project.FeeRate.getActivateFeeRate();
  455. me.mainFeeRateData = projectObj.project.FeeRate.getActivateFeeRate().rates;
  456. me.mainFeeRateSheet.setRowCount(0);
  457. me.mainFeeRateSheet.setRowCount(me.mainFeeRateData.length);
  458. me.showFeeRateTree(me.mainFeeRateSheet,me.mainFeeRateSetting,me.mainFeeRateData);
  459. me.mainFeeRateSheet.setSelection(selected.row,selected.col,selected.rowCount,selected.colCount);
  460. },
  461. reFreshRateViews:function() {
  462. feeRateObject.loadPageContent();
  463. this.showMainFeeRateData();
  464. if(subRateObject.subRateSpread){//如果子费率没有初始化过的话,不需要显示。
  465. subRateObject.initSubRateSpread(this.mainFeeRateData[0]);
  466. }
  467. },
  468. mainFeeRateEditChecking:function (row,col) {//false 不能编辑,true 可以编辑
  469. let me =feeRateObject;
  470. let recode = me.mainFeeRateData[row];
  471. let dataCode = me.mainFeeRateSetting.header[col].dataCode;
  472. if(dataCode=="rate"&&(recode.sum != true && me.getChildrenCount(recode.ID,me.mainFeeRateData)>0)){//除了标记要汇总的节点,其它的有子节点时不能编辑费率列
  473. return false;
  474. }
  475. return true;
  476. },
  477. onMainFeeRateSheetValueChange:function (e,info) {
  478. feeRateObject.updateFeerateWhenCellsChange([info]);
  479. },
  480. onMainFeeRateRangeChanged:function (e,info) {
  481. let me = feeRateObject;
  482. let changeCells = [];
  483. for(let c of info.changedCells){
  484. let tem = {
  485. row:c.row,
  486. col:c.col,
  487. newValue:info.sheet.getCell(c.row,c.col).value()
  488. };
  489. changeCells.push(tem);
  490. }
  491. me.updateFeerateWhenCellsChange(changeCells);
  492. },
  493. sumParentRate:function (subRateID,subValue,updateDatas) {
  494. let feeRate = projectObj.project.FeeRate;
  495. sum(subRateID,subValue);
  496. function sum(rateID,value){
  497. let rate = feeRate.getFeeRateByID(rateID);
  498. let parent = feeRate.getFeeRateByID(rate.ParentID);
  499. if(parent && parent.sum == true){
  500. let suRates = feeRate.getChildrenByID(parent.ID);
  501. let total = 0;
  502. for(let r of suRates) {
  503. let tem = r.rate ? r.rate:0;
  504. tem = scMathUtil.roundForObj(tem,getDecimal("feeRate"));
  505. if (rateID == r.ID){
  506. tem = value;
  507. }else {
  508. let u = _.find(updateDatas,{"rateID":r.ID})//看是不是更新的过程中包含了汇总的数据
  509. if(u && gljUtil.isDef(u.doc.rate)) tem = u.doc.rate;
  510. }
  511. total = scMathUtil.roundForObj(tem + total,getDecimal('process'))
  512. }
  513. total = scMathUtil.roundForObj(total,getDecimal("feeRate"));
  514. let tp = _.find(updateDatas,{"rateID":parent.ID});//如果父节点也在更新列表中
  515. if(tp){
  516. tp.doc.rate = total
  517. }else {
  518. updateDatas.push({rateID:parent.ID,doc:{rate:total}});
  519. }
  520. sum(parent.ID,total);
  521. }
  522. }
  523. },
  524. updateFeerateWhenCellsChange:function (cells) {// col,row,newValue
  525. let me = feeRateObject,updateDatas = [],feeRate = projectObj.project.FeeRate;//[{rateID:rateID,doc:doc}]
  526. let refreshA = [];//记录刷新条数的数组
  527. for(let c of cells){
  528. let temData = {};
  529. let recode = me.mainFeeRateData[c.row];
  530. let fieldID = me.mainFeeRateSetting.header[c.col].dataCode;
  531. let value = c.newValue;
  532. let oldValue = recode[fieldID];
  533. if(!me.mainFeeRateEditChecking(c.row, c.col)){
  534. me.mainFeeRateSheet.setValue(c.row, c.col, oldValue);
  535. continue;
  536. }else if(fieldID == 'rate'&&value !== null && value!==0){
  537. let checkResult = scMathUtil.isNumOrFormula(value);
  538. if(checkResult!=null && !isNaN(checkResult)){
  539. value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate"));
  540. }else {
  541. alert('当前输入的数据类型不正确,请重新输入。');
  542. me.mainFeeRateSheet.setValue(c.row, c.col, oldValue);
  543. continue;
  544. }
  545. }
  546. if(recode[fieldID] == value){//没有改变
  547. continue;
  548. }
  549. temData[fieldID] = value ;
  550. updateDatas.push({rateID:recode.ID,doc:temData});
  551. if(fieldID == 'rate') feeRateObject.sumParentRate(recode.ID,value,updateDatas);
  552. }
  553. if(updateDatas.length > 0){
  554. $.bootstrapLoading.start();
  555. feeRate.updateFeeRatesByIDs(updateDatas,async function () {
  556. let feerateInfo = [];
  557. for(let u of updateDatas){
  558. let row = _.findIndex(me.mainFeeRateData,{'ID':u.rateID});
  559. let rateItem = me.mainFeeRateData[row];
  560. for(let key in u.doc){
  561. let col = _.findIndex(me.mainFeeRateSetting.header,{'dataCode':key});
  562. me.mainFeeRateSheet.setValue(row, col, u.doc[key]);
  563. if(key == 'rate'){
  564. const foreColor = feeRateObject.rateShouldMark(rateItem, u.doc[key]) ? 'red' : 'black';
  565. me.mainFeeRateSheet.getCell(row, col).foreColor(foreColor);
  566. feerateInfo.push({rateID:u.rateID,value:u.doc[key]});
  567. }
  568. }
  569. }
  570. feerateInfo.length > 0 ?await feeRate.onFeeRatesChange(feerateInfo):'';
  571. $.bootstrapLoading.end();
  572. })
  573. }
  574. },
  575. onMainFeeRateSelectChanged:function (e, info) {
  576. let me = feeRateObject;
  577. let row = info.newSelections[0].row;
  578. me.onMainFeeRateSelect(row);
  579. },
  580. onMainFeeRateSelect:function (row) {
  581. let me = this;
  582. if(row!=-1){
  583. subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
  584. }
  585. },
  586. setRateFromSub:function (subRate,value,subList,editText,feeRateCoe) {//editText 下拉框选择的值,对于如“19.00”这样下拉选择项,value会变成19,所以在valueMap里找的时候要用editText去查找
  587. let me = feeRateObject,feeRate = projectObj.project.FeeRate;
  588. let rates = feeRate.getActivateFeeRate().rates;
  589. let updateDatas = [];
  590. //对于有子节点的记录和可输入的记录,只支持一个参数(因为还要内插法取费率值),如果要支持两个以上的参数,valueMap要再改下~~~~
  591. for(let r of rates){
  592. if(gljUtil.isDef(r.subFeeRate)){
  593. let valueArray=[];//用来存参数的值
  594. let temP =null;//这个用来存储需要内插法记算的时候,同时,树节点的子节点改变也计在这里, 这样,改变temP的值,会体现在保存subRecode
  595. let match = false;
  596. let temR = _.cloneDeep(r);//临时存储
  597. for(let p of temR.subFeeRate.recodes){
  598. if(p.name == subRate.name){
  599. temP = p;
  600. match = true;
  601. }
  602. let setValue = false;
  603. for(let o of p.optionList){
  604. if(match == true) {//匹配上了,改对应的selected 为 true
  605. if(o.name == value){
  606. o.selected = true;
  607. valueArray.push(editText);//这里要用字符串去匹配而不是转换成数值的value
  608. setValue = true;
  609. }else {
  610. o.selected = false;
  611. }
  612. }else {//没有匹配上的,直接取值就可以(这个是为多参数时用的,但是目前来看,不支持多参数,比较麻烦)
  613. if(o.selected == true) valueArray.push(o.name);
  614. }
  615. }
  616. if(match==true && setValue ==false) valueArray.push(value);//如果匹配上了,但是setValue为false,说明没有满足和选项,要用内插法或超出倍数算值
  617. }
  618. if(match == true){//说明要改rate的值,先从valueMap中去查
  619. if(subList && temP.subList && temP.subList.length > 0){
  620. temP.subList = subList;// 设置树节点的子节点的值
  621. }
  622. let doc = {"subFeeRate":temR.subFeeRate};
  623. let valueKey = valueArray.join('-');
  624. let valueMaps = r.subFeeRate.valueMaps;
  625. if(me.feeRateSpecialHandle){//不同编办特殊处理
  626. let sf = me.feeRateSpecialHandle(subRate,value);
  627. if(!_.isEmpty(sf)){
  628. valueKey = sf.valueKey;
  629. temP.value = sf.value;
  630. }
  631. }
  632. let rate = _.find(valueMaps,{"ID":valueKey});
  633. if(isDef(rate)) {//找到了,直接改费率值
  634. doc.rate = rate.value;
  635. } else {//没找到,用内插法或步长算值
  636. let ltRate = null;//
  637. let gtRate = null;
  638. temP.value = scMathUtil.roundForObj(value,getDecimal("feeRate")) ;
  639. for(let v of valueMaps){
  640. if(parseFloat(v.ID)<parseFloat(value)){
  641. ltRate = v;
  642. }else if( gtRate==null && parseFloat(v.ID)>parseFloat(value)){
  643. gtRate = v;
  644. }
  645. }
  646. if(gljUtil.isDef(ltRate)&&gljUtil.isDef(gtRate)){//已经找到前后的值了
  647. let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,getDecimal("process"));
  648. let total = parseFloat(gtRate.ID) - parseFloat(ltRate.ID)
  649. doc.rate =getRateByStep(ltRate.value,total,parseFloat(value) - parseFloat(ltRate.ID),step);
  650. }else if(gljUtil.isDef(ltRate)&&gtRate == null){//说明是超出了选项的最大值
  651. let share = parseFloat(value) - parseFloat(ltRate.ID);//超出了多少
  652. doc.rate = getRateByStep(ltRate.value,temP.step,share,temP.amount)
  653. }else if(gljUtil.isDef(gtRate)&&ltRate==null){//说明是只有一个选项,且这个选项比输入的值大
  654. let step = parseFloat(gtRate.value)- 0;
  655. doc.rate = getRateByStep(0,gtRate.value,value,step)
  656. }
  657. }
  658. if(isDef(doc.rate)){
  659. if(feeRateCoe) doc.rate = scMathUtil.roundForObj(doc.rate * feeRateCoe,getDecimal("feeRate")); //如果是从乘系数过来的,乘以系数。
  660. updateDatas.push({rateID:r.ID,doc:doc});
  661. me.sumParentRate(r.ID,doc.rate,updateDatas);
  662. }
  663. }
  664. }
  665. }
  666. if(updateDatas.length > 0){
  667. $.bootstrapLoading.start();
  668. feeRate.updateFeeRatesByIDs(updateDatas,async function () {
  669. let feerateInfo = [];
  670. for(let u of updateDatas){
  671. feerateInfo.push({rateID:u.rateID,value:u.doc["rate"]});
  672. }
  673. subRateObject.showSubRateData();
  674. me.showMainFeeRateData();
  675. if(feerateInfo.length > 0){
  676. await feeRate.onFeeRatesChange(feerateInfo);
  677. }else {
  678. $.bootstrapLoading.end();
  679. }
  680. })
  681. }
  682. function getRateByStep(ltValue,total,share,step) { //min值 ,计算值的总区间, 区间中占比,步长--后端重选标准也要用到
  683. let p = scMathUtil.roundForObj(share/total,getDecimal("process"));
  684. let a = scMathUtil.roundForObj(step * p,getDecimal("process")) ;
  685. return scMathUtil.roundForObj(ltValue + a,getDecimal("feeRate"))
  686. }
  687. },
  688. cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
  689. let items=[];
  690. items.push({rateIndex:sourceRow,rate:selectedItem});
  691. _.forEach(this.mainFeeRateData,function (recode,Index) {
  692. if(Index!=sourceRow&&recode.subFeeRate){
  693. let valueMaps = recode.subFeeRate.valueMaps;
  694. let valueMap = _.find(valueMaps,{ID:mapID});
  695. if(valueMap){//选项完全一样的情况
  696. if(valueMap.value==recode.rate){
  697. return;
  698. }else {
  699. recode.rate = valueMap.value;
  700. _.forEach(selectMap,function (value,key) {
  701. let tempRecode = recode.subFeeRate.recodes[key];
  702. let optionList = tempRecode.optionList;
  703. for(let o of optionList){
  704. o.value===value? o.selected = true:o.selected = false;
  705. }
  706. });
  707. items.push({rateIndex:Index,rate:recode});
  708. }
  709. }else {//某条选项一样的情况
  710. let needUpdate = false;
  711. let selectList = mapID.split('-');
  712. let newList=[];
  713. _.forEach(recode.subFeeRate.recodes,function (r) {
  714. let oList = r.optionList, oldSelectIndex=0, hasChange=false;
  715. _.forEach(oList,function (o,key) {
  716. if(o.selected) oldSelectIndex = key;
  717. if(_.includes(selectList,o.value)){
  718. needUpdate=true;
  719. o.selected=true;
  720. hasChange=true;
  721. newList.push(o.value);
  722. }else {
  723. o.selected=false;
  724. }
  725. });
  726. if(!hasChange){
  727. oList[oldSelectIndex].selected=true;
  728. newList.push(oList[oldSelectIndex].value)
  729. }
  730. });
  731. if(needUpdate){
  732. let newValue = _.find(valueMaps,{ID:newList.join("-")})//取出费率值并更新
  733. if(newValue){
  734. if(recode.rate != newValue.value){
  735. recode.rate = newValue.value;
  736. items.push({rateIndex:Index,rate:recode});
  737. }
  738. }
  739. }
  740. }
  741. }
  742. });
  743. projectObj.project.FeeRate.batchUpdateFeeRate(items,feeRateObject.activateFeeRate);
  744. },
  745. loadPageContent:function(){
  746. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  747. var usageProjects = feeRateFile.usageProjects;
  748. feeRateObject.setLocAndFeeRateSTD();
  749. $('#feeRateFileName').text(feeRateFile.name);
  750. $('#feeRateLibName').text(feeRateFile.libName);
  751. $('#projectCount').text(usageProjects.length);
  752. },
  753. setLocAndFeeRateSTD:function(){
  754. if(feeRateObject.feeRateSTDLoaded) return;
  755. let location = this.getLocation();
  756. $('#location').val(location);
  757. //养护的工程所在地下拉框不可选
  758. if(!commonUtil.isGLYun()) $('#location').attr("disabled","disabled");
  759. feeRateObject.setFeeRateSTD(location);
  760. feeRateObject.feeRateSTDLoaded = true;
  761. },
  762. getLocation:function(){
  763. let location = projectObj.project.projectInfo.location;
  764. if(!gljUtil.isDef(location)) location = defaultLocation;
  765. return location;
  766. },
  767. setFeeRateSTD(location){
  768. let feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  769. $('#feeRateStandard').empty();
  770. setOption(feeRateFile.libID,feeRateFile.libName)
  771. feeRateObject.getFeeRateStandards(function (data) {
  772. _.forEach(data,function (s) {
  773. if(s.ID != feeRateFile.libID){
  774. if(s.libName.startsWith("部颁")){
  775. setOption(s.ID,s.libName)
  776. }else {
  777. if(location){
  778. if(s.libName.startsWith(location)) setOption(s.ID,s.libName)
  779. }else{
  780. setOption(s.ID,s.libName)
  781. }
  782. }
  783. }
  784. })
  785. $('#feeRateStandard').val(feeRateFile.libID);
  786. });
  787. function setOption(ID,name){
  788. var option = $("<option>").val(ID).text(name);
  789. $('#feeRateStandard').append(option);
  790. }
  791. },
  792. loadLocationList:function(){
  793. let htmlS = "<option></option>";
  794. for(let l of locationList){
  795. htmlS += `<option value='${l}'>${l} </option>`
  796. }
  797. $('#location').html(htmlS)
  798. },
  799. loadFeeRateSelection:function() {
  800. if(!this.selectionLoad){
  801. var selectedID=0;
  802. _.forEach(projectObj.project.FeeRate.datas,function (data) {
  803. var option = $("<option>").val(data.ID).text(data.libName);
  804. $('#inlineFormCustomSelect').append(option);
  805. if(data.status=='activate'){
  806. selectedID=data.ID;
  807. }
  808. })
  809. $('#inlineFormCustomSelect').val(selectedID);
  810. }
  811. },
  812. getFeeRateStandards:function (callback) {
  813. if(feeRateObject.feeRateSTDList.length == 0){//没有的话发送请求,存在的话直接返回
  814. CommonAjax.post('/feeRates/getFeeRateStandards', {"projectID": projectObj.project.ID()}, function (data) {
  815. if (data) {
  816. feeRateObject.feeRateSTDList = data;
  817. callback(data);
  818. }
  819. });
  820. }else{
  821. callback(feeRateObject.feeRateSTDList);
  822. }
  823. },
  824. changeFeeRateStandard:function(newVal){
  825. $.bootstrapLoading.start();
  826. var callback=function () {
  827. feeRateObject.reFreshRateViews();
  828. feeRateObject.setFeeRateSTD($("#location").val());
  829. $.bootstrapLoading.end();
  830. };
  831. projectObj.project.FeeRate.changeFeeRateStandard(newVal,callback);
  832. },
  833. checkFeeRateName:function (newVal) {
  834. if(!newVal||newVal==""){
  835. //$('#saveAsConfirm').attr("disabled","disabled");
  836. $('#nameError').text("请输入文件名称。").show();
  837. return;
  838. }
  839. var callback=function (data) {
  840. if(data){
  841. // $('#saveAsConfirm').attr("disabled","disabled");
  842. $('#nameError').text("已存在同名费率文件。").show();
  843. $('#valid_name').val('');
  844. }else {
  845. $('#valid_name').val(newVal);
  846. $('#saveAsConfirm').removeAttr("disabled");
  847. $('#nameError').hide();
  848. }
  849. };
  850. projectObj.project.FeeRate.checkFeeRateName(newVal,callback);
  851. },
  852. feeRateFileSaveAs:function (newName) {
  853. if(!newName||newName==""){
  854. // $('#saveAsConfirm').attr("disabled","disabled");
  855. $('#nameError').text("请输入文件名称。").show();
  856. return;
  857. }
  858. let callback=function (data) {
  859. if(data){
  860. // $('#saveAsConfirm').attr("disabled","disabled");
  861. $('#nameError').text("已存在同名费率文件。").show();
  862. $('#valid_name').val('');
  863. }else {
  864. feeRateObject.submitSaveAs(newName);
  865. }
  866. }
  867. projectObj.project.FeeRate.checkFeeRateName(newName,callback);
  868. /* let valideName = $('#valid_name').val();
  869. if(valideName==''||valideName!==newName){
  870. }else {
  871. feeRateObject.submitSaveAs(newName);
  872. }*/
  873. },
  874. submitSaveAs:function (newName) {
  875. let me = this;
  876. let FeeRate = projectObj.project.FeeRate;
  877. FeeRate.feeRateFileSaveAs(newName,function (result) {
  878. me.activateFeeRate = result;
  879. me.loadPageContent();
  880. $('#copy-lv').modal('hide');
  881. let data ={
  882. projectID:projectObj.project.ID(),
  883. oldRoom:socketObject.roomInfo.feeRate,
  884. newRoom: FeeRate.getActivateFeeRateFileID(),
  885. userID:userID,
  886. name:'feeRate'
  887. };
  888. socket.emit('changeNewRoom',data);
  889. socketObject.roomInfo.feeRate = FeeRate.getActivateFeeRateFileID();
  890. $.bootstrapLoading.end();
  891. });
  892. },
  893. getChangeInfo:function () {
  894. var me = this;
  895. var callback=function (data) {
  896. me.changeInfo=data;
  897. me.loadChangePageContent(data);
  898. };
  899. projectObj.project.FeeRate.getChangeInfo(callback);
  900. },
  901. loadChangePageContent:function (data) {
  902. $('#currentProject').text(data.currentProject.name);
  903. $('#currentOptions').empty();
  904. _.forEach(data.currentProject.currentOptions,function (s) {
  905. var option = $("<option>").val(s.ID).text(s.name);
  906. $('#currentOptions').append(option);
  907. })
  908. $('#otherProject').empty();
  909. _.forEach(data.others,function (p) {
  910. var option = $("<option>").val(p.ID).text(p.name);
  911. $('#otherProject').append(option);
  912. });
  913. $('#otherFeeRateOption').empty();
  914. if(data.others.length>0){
  915. _.forEach(data.others[0].optionList,function (f) {
  916. var option = $("<option>").val(f.ID).text(f.name);
  917. $('#otherFeeRateOption').append(option);
  918. });
  919. }
  920. },
  921. changeFeeRateFileFromCurrent:function(){
  922. $.bootstrapLoading.start();
  923. var newVal = $("#currentOptions").val();
  924. if(!$("#currentOptions").val()){
  925. if($.bootstrapLoading.isLoading()){
  926. $.bootstrapLoading.end();
  927. }
  928. alert('费率文件不可为空');
  929. return;
  930. }
  931. if($("#currentOptions").val()==this.activateFeeRate.ID){
  932. return;
  933. }
  934. var name =$("#currentOptions").find("option:selected").text();
  935. var newFeeRateFile = {
  936. id:newVal,
  937. name:name
  938. }
  939. var callback=function () {
  940. feeRateObject.reFreshRateViews();
  941. projectObj.project.FeeRate.onFeeRateFileChange();
  942. $.bootstrapLoading.end();
  943. }
  944. projectObj.project.FeeRate.changeFeeRateFileFromCurrent(newFeeRateFile,callback);
  945. },
  946. changeFeeRateFileFromOthers:function () {
  947. var feeRateFileID = $("#otherFeeRateOption").val();
  948. var name =$("#otherFeeRateOption").find("option:selected").text();
  949. if(null===feeRateFileID){
  950. alert("请选择一个费率文件!");
  951. return;
  952. }
  953. var callback=function (data) {
  954. if(data){
  955. //$('#renameConfirm').attr("disabled","disabled");
  956. $('#renameError').text("本建设项目中已存在同名费率文件。").show();
  957. $('#rename-lv').modal('show');
  958. $("#newFeeRateID").val(feeRateFileID);
  959. $("#newFeeRateName").val(name);
  960. }else {
  961. //$('#renameConfirm').removeAttr("disabled");
  962. $('#renameError').hide();
  963. feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
  964. }
  965. };
  966. projectObj.project.FeeRate.checkFeeRateName(name,callback);
  967. /* var currentOption = _.find(this.changeInfo.currentProject.currentOptions,{name:name})
  968. if(currentOption){
  969. $("#rename-lv").modal({show:true});
  970. $("#newFeeRateID").val(feeRateFileID);
  971. $("#newFeeRateName").val(name);
  972. }else {
  973. this.changeFeeRateFileConfirm(feeRateFileID,name);
  974. }*/
  975. },
  976. changeFeeRateFileConfirm:function(feeRateFileID,name){
  977. $.bootstrapLoading.start();
  978. var callback=function () {
  979. feeRateObject.reFreshRateViews();
  980. projectObj.project.FeeRate.onFeeRateFileChange();
  981. $.bootstrapLoading.end();
  982. }
  983. projectObj.project.FeeRate.changeFeeRateFileFromOthers(feeRateFileID,name,callback);
  984. },
  985. setFeeRateCellCol:function (sheet,col) {
  986. sheet.getRange(-1, col, -1, 1).cellType(this.getFeeRateEditCellType());
  987. },
  988. onCellClick:function (sender,args) {
  989. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  990. feeRateObject.feeRateSelection=data[args.row];
  991. },
  992. onCellDoubleClick:function (sender,args) {
  993. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  994. feeRateObject.feeRateSelection=data[args.row];
  995. feeRateObject.submitFeeRateBySelect();
  996. },
  997. checkSelectedFeeRate:function () {
  998. var validate = false;
  999. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  1000. if(feeRateObject.feeRateSelection!=null){
  1001. var children=_.filter(data,{'ParentID':feeRateObject.feeRateSelection.ID});
  1002. validate=children&&children.length==0;
  1003. }
  1004. return validate;
  1005. },
  1006. submitFeeRateFromBill:function () {
  1007. var rate = feeRateObject.feeRateSelection;
  1008. var selected = projectObj.project.mainTree.selected;
  1009. if(selected.data.feeRateID === parseInt(rate.ID)) return $("#calcBaseFeeRate").modal('hide');
  1010. $.bootstrapLoading.start();
  1011. projectObj.project.FeeRate.submitFeeRateFromBill(rate,selected.data,function (data) {
  1012. selected.updateData.feeRateID= parseInt(rate.ID);
  1013. selected.updateData.feeRate=scMathUtil.roundToString(rate.rate,getDecimal("feeRate"));
  1014. selected.changed = true;
  1015. projectObj.project.calcProgram.calcAndSave(selected);
  1016. $("#calcBaseFeeRate").modal('hide');
  1017. $.bootstrapLoading.end();
  1018. });
  1019. },
  1020. submitFeeRateFromCalc:function () {
  1021. var rate = feeRateObject.feeRateSelection;
  1022. var calInfo = calcProgramManage.getSelectionInfo();
  1023. calInfo.calcItem.feeRateID=rate.ID;
  1024. calInfo.calcItem.feeRate=null;
  1025. var data={'projectID': projectObj.project.ID(),'templatesID': calInfo.template.ID,'calcItem': calInfo.calcItem};
  1026. $.bootstrapLoading.start();
  1027. calcProgramManage.saveCalcItem(data,function (result) {
  1028. calInfo.calcItem.feeRate=rate.rate;
  1029. projectObj.project.calcProgram.compileAllTemps();
  1030. projectObj.project.calcProgram.calcAllNodesAndSave();
  1031. calcProgramManage.refreshDetailSheet();
  1032. $("#calcBaseFeeRate").modal('hide');
  1033. $.bootstrapLoading.end();
  1034. });
  1035. console.log(calInfo);
  1036. },
  1037. submitFeeRateBySelect:function () {
  1038. var validate = this.checkSelectedFeeRate();
  1039. if(validate){
  1040. if($('#edit_from').val()=='calc_detail'){
  1041. this.submitFeeRateFromCalc();
  1042. }else {
  1043. this.submitFeeRateFromBill();
  1044. }
  1045. }else {
  1046. //$("#fee_rate_tree").modal('hide');
  1047. }
  1048. }
  1049. }
  1050. function getPopoverContent() {
  1051. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1052. var usageProjects = feeRateFile.usageProjects;
  1053. let names = _.map(usageProjects,'name');
  1054. let popover_content = names.join('<br>');
  1055. return "费率的变化,将自动影响以下单位工程造价:<br>"+ popover_content;
  1056. }
  1057. $(function(){
  1058. $('#pop-lv').tooltip({
  1059. placement:"bottom",
  1060. html:true,
  1061. trigger:"hover | focus",
  1062. title:getPopoverContent
  1063. }
  1064. );
  1065. feeRateObject.loadLocationList();
  1066. $('#tab_fee_rate').on('shown.bs.tab', function (e) {
  1067. sessionStorage.setItem('mainTab', '#tab_fee_rate');
  1068. let me = feeRateObject;
  1069. $(e.relatedTarget.hash).removeClass('active');
  1070. if(me.mainFeeRateSpread == null) me.initFeeRateSpread(0);
  1071. subRateObject.initSubRateSpread();
  1072. me.showMainFeeRateData();
  1073. me.loadPageContent();
  1074. });
  1075. //切换选择工程所在地
  1076. $('#location').change(async function () {
  1077. //console.log(this.value);
  1078. let updateData = {type:ModuleNames.project,isInfo:true,data:{'ID' : projectObj.project.ID(),location:this.value}};//,'property.locateSetting':outstd
  1079. $.bootstrapLoading.start();
  1080. await projectObj.project.syncUpdateNodesAndRefresh([updateData]);
  1081. feeRateObject.setFeeRateSTD(this.value);
  1082. subRateObject.showSubRateData();
  1083. $.bootstrapLoading.end();
  1084. });
  1085. //切换费率标准
  1086. $('#feeRateStandard').change(async function () {
  1087. feeRateObject.changeFeeRateStandard(this.value);
  1088. });
  1089. $('#setNewFeeRate').bind('click', function () {
  1090. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1091. var usageProjects = feeRateFile.usageProjects;
  1092. var listString ='';
  1093. _.forEach(usageProjects,function (u) {
  1094. listString+="<li>"+u.name+"</li>"
  1095. })
  1096. $("#usageProjectList").html(listString);
  1097. $("#set-lv-feeRateName").text(feeRateFile.name);
  1098. $("#set-use-feeRateName").text(feeRateFile.name);
  1099. feeRateObject.getFeeRateStandards(function (data) {
  1100. $('#standardSelect').empty();
  1101. _.forEach(data,function (s) {
  1102. var option = $("<option>").val(s.ID).text(s.libName);
  1103. $('#standardSelect').append(option);
  1104. })
  1105. $('#standardSelect').val(feeRateFile.libID);
  1106. });
  1107. });
  1108. $('#changeConfirm').bind('click', function (){
  1109. var newVal=$('#standardSelect').val();
  1110. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1111. feeRateObject.changeFeeRateStandard(newVal);
  1112. //这里改成不判断了,只是点击确定了就重选
  1113. //if(newVal&&newVal!=feeRateFile.libID) feeRateObject.changeFeeRateStandard(newVal);
  1114. });
  1115. $('#save-as').bind('click', function (){
  1116. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1117. $('#copyFeeRateName').val(feeRateFile.name+'副本');
  1118. $('#valid_name').val(feeRateFile.name+'副本');
  1119. $('#nameError').hide();
  1120. });
  1121. $('#saveAsConfirm').bind('click',function () {
  1122. feeRateObject.feeRateFileSaveAs($('#copyFeeRateName').val());
  1123. })
  1124. $('#copyFeeRateName').change(function () {
  1125. feeRateObject.checkFeeRateName(this.value);
  1126. });
  1127. $('#newFeeRateName').change(function () {
  1128. var newName = $(this).val();
  1129. if(!newName||newName==""){
  1130. //$('#renameConfirm').attr("disabled","disabled");
  1131. $('#renameError').text("请输入文件名称。").show();
  1132. return;
  1133. }
  1134. var callback=function (data) {
  1135. if(data){
  1136. //$('#renameConfirm').attr("disabled","disabled");
  1137. $('#renameError').text("本建设项目中已存在同名费率文件。").show();
  1138. }else {
  1139. //$('#renameConfirm').removeAttr("disabled");
  1140. $('#renameError').hide();
  1141. }
  1142. };
  1143. projectObj.project.FeeRate.checkFeeRateName(newName,callback);
  1144. });
  1145. $('#changeFeeRateConfirm').bind('click',function (){
  1146. var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
  1147. if(radioV==='0'){
  1148. feeRateObject.changeFeeRateFileFromCurrent();
  1149. }else {
  1150. feeRateObject.changeFeeRateFileFromOthers();
  1151. }
  1152. })
  1153. $('#changFeeRateFile').bind('click',function (){
  1154. $("input[name='chaneg-lv-Radio']")[0].checked=true;
  1155. $("#fromProject").show();
  1156. $("#fromOther").hide();
  1157. feeRateObject.getChangeInfo();
  1158. })
  1159. $('#otherProject').change(function(){
  1160. var newVal = $(this).val();
  1161. var projects = feeRateObject.changeInfo.others;
  1162. var selected = _.find(projects,{ID:parseInt(newVal)});
  1163. $('#otherFeeRateOption').empty();
  1164. _.forEach(selected.optionList,function (f) {
  1165. var option = $("<option>").val(f.ID).text(f.name);
  1166. $('#otherFeeRateOption').append(option);
  1167. });
  1168. })
  1169. $('#renameConfirm').bind('click',function (){
  1170. var feeRateFileID= $("#newFeeRateID").val();
  1171. var name = $("#newFeeRateName").val();
  1172. var callback=function (data) {
  1173. if(data){
  1174. $('#renameError').text("已存在同名费率文件。").show();
  1175. $("#newFeeRateID").val(feeRateFileID);
  1176. $("#newFeeRateName").val(name);
  1177. }else {
  1178. $('#renameError').hide();
  1179. $('#rename-lv').modal('hide');
  1180. feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
  1181. }
  1182. };
  1183. projectObj.project.FeeRate.checkFeeRateName(name,callback);
  1184. })
  1185. $('#inlineFormCustomSelect').change(function(){
  1186. var updateTask = [];
  1187. var selectID = $(this).val();
  1188. var oldValue=0;
  1189. _.forEach(projectObj.project.FeeRate.datas,function (feeRate) {
  1190. if(feeRate.status=='activate'){
  1191. oldValue=feeRate.ID;
  1192. }
  1193. if(feeRate.ID ==selectID){
  1194. feeRate.status='activate';
  1195. }else {
  1196. feeRate.status='disable';
  1197. }
  1198. updateTask.push({query:{ID:feeRate.feeRateID},doc:{status:feeRate.status}});
  1199. })
  1200. projectObj.project.FeeRate.updateStatusBySelected(updateTask);
  1201. feeRateObject.createSpreadView();
  1202. subRateObject.destorySpreadView();
  1203. socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
  1204. })
  1205. $('#calcBaseFeeRate').on('shown.bs.modal', function (e) {
  1206. let toggle = $('#calcBaseFeeRateConf').attr('toggle');
  1207. if(feeRateObject.feeRateSpreads==null){
  1208. feeRateObject.createSheet();
  1209. }
  1210. feeRateObject.initFeeRateEditDiv();
  1211. feeRateObject.feeRateSelection=null;
  1212. feeRateObject.showFeeRateTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
  1213. feeRateObject.locate();
  1214. feeRateObject.feeRateSpreads.refresh();
  1215. });
  1216. $('#tabFeeRate').on('shown.bs.tab', function () {
  1217. if(feeRateObject.feeRateSpreads){
  1218. feeRateObject.feeRateSpreads.refresh();
  1219. }
  1220. });
  1221. $('#calcBaseFeeRate').on('hidden.bs.modal', function (e) {
  1222. if(feeRateObject.feeRateSpreads){
  1223. feeRateObject.feeRateSpreads.destroy();
  1224. feeRateObject.feeRateSpreads=null;
  1225. $('#edit_from').val('');
  1226. $('#edit_row').val('');
  1227. }
  1228. });
  1229. //fee_selected_conf
  1230. $('#calcBaseFeeRateConf').bind('click',function (){
  1231. let toggle = $(this).attr('toggle');
  1232. if(!toggle || toggle !== 'feeRate'){
  1233. return;
  1234. }
  1235. feeRateObject.submitFeeRateBySelect();
  1236. });
  1237. $("input[name='editFeeRateOptions']").each(function(){
  1238. $(this).click(function(){
  1239. let optins = $(this).val();
  1240. if(optins == "0"){
  1241. $("#selfDiv").show();
  1242. $("#fee_rate_sheet").hide();
  1243. }else {
  1244. $("#selfDiv").hide();
  1245. $("#fee_rate_sheet").show(function () {
  1246. feeRateObject.feeRateSpreads.refresh();
  1247. });
  1248. }
  1249. });
  1250. });
  1251. })
  1252. function changeFRadioClick() {
  1253. var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
  1254. if(radioV==='0'){
  1255. $("#fromProject").show();
  1256. $("#fromOther").hide();
  1257. }else {
  1258. $("#fromProject").hide();
  1259. $("#fromOther").show();
  1260. }
  1261. }