fee_rate_view.js 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  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 (rateID,value,updateDatas) {
  494. let feeRate = projectObj.project.FeeRate;
  495. let rate = feeRate.getFeeRateByID(rateID);
  496. let parent = feeRate.getFeeRateByID(rate.ParentID);
  497. if(parent && parent.sum == true){
  498. let suRates = feeRate.getChildrenByID(parent.ID);
  499. let total = 0;
  500. for(let r of suRates) {
  501. let tem = r.rate ? r.rate:0;
  502. tem = scMathUtil.roundForObj(tem,getDecimal("feeRate"));
  503. if (rateID == r.ID){
  504. tem = value;
  505. }else {
  506. let u = _.find(updateDatas,{"rateID":r.ID})//看是不是更新的过程中包含了汇总的数据
  507. if(u && gljUtil.isDef(u.doc.rate)) tem = u.doc.rate;
  508. }
  509. total = scMathUtil.roundForObj(tem + total,getDecimal('process'))
  510. }
  511. total = scMathUtil.roundForObj(total,getDecimal("feeRate"));
  512. let tp = _.find(updateDatas,{"rateID":parent.ID});//如果父节点也在更新列表中
  513. if(tp){
  514. tp.doc.rate = total
  515. }else {
  516. updateDatas.push({rateID:parent.ID,doc:{rate:total}});
  517. }
  518. }
  519. },
  520. updateFeerateWhenCellsChange:function (cells) {// col,row,newValue
  521. let me = feeRateObject,updateDatas = [],feeRate = projectObj.project.FeeRate;//[{rateID:rateID,doc:doc}]
  522. let refreshA = [];//记录刷新条数的数组
  523. for(let c of cells){
  524. let temData = {};
  525. let recode = me.mainFeeRateData[c.row];
  526. let fieldID = me.mainFeeRateSetting.header[c.col].dataCode;
  527. let value = c.newValue;
  528. let oldValue = recode[fieldID];
  529. if(!me.mainFeeRateEditChecking(c.row, c.col)){
  530. me.mainFeeRateSheet.setValue(c.row, c.col, oldValue);
  531. continue;
  532. }else if(fieldID == 'rate'&&value !== null && value!==0){
  533. let checkResult = scMathUtil.isNumOrFormula(value);
  534. if(checkResult!=null && !isNaN(checkResult)){
  535. value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate"));
  536. }else {
  537. alert('当前输入的数据类型不正确,请重新输入。');
  538. me.mainFeeRateSheet.setValue(c.row, c.col, oldValue);
  539. continue;
  540. }
  541. }
  542. if(recode[fieldID] == value){//没有改变
  543. continue;
  544. }
  545. temData[fieldID] = value ;
  546. updateDatas.push({rateID:recode.ID,doc:temData});
  547. if(fieldID == 'rate') feeRateObject.sumParentRate(recode.ID,value,updateDatas);
  548. }
  549. if(updateDatas.length > 0){
  550. $.bootstrapLoading.start();
  551. feeRate.updateFeeRatesByIDs(updateDatas,async function () {
  552. let feerateInfo = [];
  553. for(let u of updateDatas){
  554. let row = _.findIndex(me.mainFeeRateData,{'ID':u.rateID});
  555. let rateItem = me.mainFeeRateData[row];
  556. for(let key in u.doc){
  557. let col = _.findIndex(me.mainFeeRateSetting.header,{'dataCode':key});
  558. me.mainFeeRateSheet.setValue(row, col, u.doc[key]);
  559. if(key == 'rate'){
  560. const foreColor = feeRateObject.rateShouldMark(rateItem, u.doc[key]) ? 'red' : 'black';
  561. me.mainFeeRateSheet.getCell(row, col).foreColor(foreColor);
  562. feerateInfo.push({rateID:u.rateID,value:u.doc[key]});
  563. }
  564. }
  565. }
  566. feerateInfo.length > 0 ?await feeRate.onFeeRatesChange(feerateInfo):'';
  567. $.bootstrapLoading.end();
  568. })
  569. }
  570. },
  571. onMainFeeRateSelectChanged:function (e, info) {
  572. let me = feeRateObject;
  573. let row = info.newSelections[0].row;
  574. me.onMainFeeRateSelect(row);
  575. },
  576. onMainFeeRateSelect:function (row) {
  577. let me = this;
  578. if(row!=-1){
  579. subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
  580. }
  581. },
  582. setRateFromSub:function (subRate,value,subList,editText,feeRateCoe) {//editText 下拉框选择的值,对于如“19.00”这样下拉选择项,value会变成19,所以在valueMap里找的时候要用editText去查找
  583. let me = feeRateObject,feeRate = projectObj.project.FeeRate;
  584. let rates = feeRate.getActivateFeeRate().rates;
  585. let updateDatas = [];
  586. //对于有子节点的记录和可输入的记录,只支持一个参数(因为还要内插法取费率值),如果要支持两个以上的参数,valueMap要再改下~~~~
  587. for(let r of rates){
  588. if(gljUtil.isDef(r.subFeeRate)){
  589. let valueArray=[];//用来存参数的值
  590. let temP =null;//这个用来存储需要内插法记算的时候,同时,树节点的子节点改变也计在这里, 这样,改变temP的值,会体现在保存subRecode
  591. let match = false;
  592. let temR = _.cloneDeep(r);//临时存储
  593. for(let p of temR.subFeeRate.recodes){
  594. if(p.name == subRate.name){
  595. temP = p;
  596. match = true;
  597. }
  598. let setValue = false;
  599. for(let o of p.optionList){
  600. if(match == true) {//匹配上了,改对应的selected 为 true
  601. if(o.name == value){
  602. o.selected = true;
  603. valueArray.push(editText);//这里要用字符串去匹配而不是转换成数值的value
  604. setValue = true;
  605. }else {
  606. o.selected = false;
  607. }
  608. }else {//没有匹配上的,直接取值就可以(这个是为多参数时用的,但是目前来看,不支持多参数,比较麻烦)
  609. if(o.selected == true) valueArray.push(o.name);
  610. }
  611. }
  612. if(match==true && setValue ==false) valueArray.push(value);//如果匹配上了,但是setValue为false,说明没有满足和选项,要用内插法或超出倍数算值
  613. }
  614. if(match == true){//说明要改rate的值,先从valueMap中去查
  615. if(subList && temP.subList && temP.subList.length > 0){
  616. temP.subList = subList;// 设置树节点的子节点的值
  617. }
  618. let doc = {"subFeeRate":temR.subFeeRate};
  619. let valueKey = valueArray.join('-');
  620. let valueMaps = r.subFeeRate.valueMaps;
  621. if(me.feeRateSpecialHandle){//不同编办特殊处理
  622. let sf = me.feeRateSpecialHandle(subRate,value);
  623. if(!_.isEmpty(sf)){
  624. valueKey = sf.valueKey;
  625. temP.value = sf.value;
  626. }
  627. }
  628. let rate = _.find(valueMaps,{"ID":valueKey});
  629. if(isDef(rate)) {//找到了,直接改费率值
  630. doc.rate = rate.value;
  631. } else {//没找到,用内插法或步长算值
  632. let ltRate = null;//
  633. let gtRate = null;
  634. temP.value = scMathUtil.roundForObj(value,getDecimal("feeRate")) ;
  635. for(let v of valueMaps){
  636. if(parseFloat(v.ID)<parseFloat(value)){
  637. ltRate = v;
  638. }else if( gtRate==null && parseFloat(v.ID)>parseFloat(value)){
  639. gtRate = v;
  640. }
  641. }
  642. if(gljUtil.isDef(ltRate)&&gljUtil.isDef(gtRate)){//已经找到前后的值了
  643. let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,getDecimal("process"));
  644. let total = parseFloat(gtRate.ID) - parseFloat(ltRate.ID)
  645. doc.rate =getRateByStep(ltRate.value,total,parseFloat(value) - parseFloat(ltRate.ID),step);
  646. }else if(gljUtil.isDef(ltRate)&&gtRate == null){//说明是超出了选项的最大值
  647. let share = parseFloat(value) - parseFloat(ltRate.ID);//超出了多少
  648. doc.rate = getRateByStep(ltRate.value,temP.step,share,temP.amount)
  649. }else if(gljUtil.isDef(gtRate)&&ltRate==null){//说明是只有一个选项,且这个选项比输入的值大
  650. let step = parseFloat(gtRate.value)- 0;
  651. doc.rate = getRateByStep(0,gtRate.value,value,step)
  652. }
  653. }
  654. if(isDef(doc.rate)){
  655. if(feeRateCoe) doc.rate = scMathUtil.roundForObj(doc.rate * feeRateCoe,getDecimal("feeRate")); //如果是从乘系数过来的,乘以系数。
  656. updateDatas.push({rateID:r.ID,doc:doc});
  657. me.sumParentRate(r.ID,doc.rate,updateDatas);
  658. }
  659. }
  660. }
  661. }
  662. if(updateDatas.length > 0){
  663. $.bootstrapLoading.start();
  664. feeRate.updateFeeRatesByIDs(updateDatas,async function () {
  665. let feerateInfo = [];
  666. for(let u of updateDatas){
  667. feerateInfo.push({rateID:u.rateID,value:u.doc["rate"]});
  668. }
  669. subRateObject.showSubRateData();
  670. me.showMainFeeRateData();
  671. if(feerateInfo.length > 0){
  672. await feeRate.onFeeRatesChange(feerateInfo);
  673. }else {
  674. $.bootstrapLoading.end();
  675. }
  676. })
  677. }
  678. function getRateByStep(ltValue,total,share,step) { //min值 ,计算值的总区间, 区间中占比,步长--后端重选标准也要用到
  679. let p = scMathUtil.roundForObj(share/total,getDecimal("process"));
  680. let a = scMathUtil.roundForObj(step * p,getDecimal("process")) ;
  681. return scMathUtil.roundForObj(ltValue + a,getDecimal("feeRate"))
  682. }
  683. },
  684. cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
  685. let items=[];
  686. items.push({rateIndex:sourceRow,rate:selectedItem});
  687. _.forEach(this.mainFeeRateData,function (recode,Index) {
  688. if(Index!=sourceRow&&recode.subFeeRate){
  689. let valueMaps = recode.subFeeRate.valueMaps;
  690. let valueMap = _.find(valueMaps,{ID:mapID});
  691. if(valueMap){//选项完全一样的情况
  692. if(valueMap.value==recode.rate){
  693. return;
  694. }else {
  695. recode.rate = valueMap.value;
  696. _.forEach(selectMap,function (value,key) {
  697. let tempRecode = recode.subFeeRate.recodes[key];
  698. let optionList = tempRecode.optionList;
  699. for(let o of optionList){
  700. o.value===value? o.selected = true:o.selected = false;
  701. }
  702. });
  703. items.push({rateIndex:Index,rate:recode});
  704. }
  705. }else {//某条选项一样的情况
  706. let needUpdate = false;
  707. let selectList = mapID.split('-');
  708. let newList=[];
  709. _.forEach(recode.subFeeRate.recodes,function (r) {
  710. let oList = r.optionList, oldSelectIndex=0, hasChange=false;
  711. _.forEach(oList,function (o,key) {
  712. if(o.selected) oldSelectIndex = key;
  713. if(_.includes(selectList,o.value)){
  714. needUpdate=true;
  715. o.selected=true;
  716. hasChange=true;
  717. newList.push(o.value);
  718. }else {
  719. o.selected=false;
  720. }
  721. });
  722. if(!hasChange){
  723. oList[oldSelectIndex].selected=true;
  724. newList.push(oList[oldSelectIndex].value)
  725. }
  726. });
  727. if(needUpdate){
  728. let newValue = _.find(valueMaps,{ID:newList.join("-")})//取出费率值并更新
  729. if(newValue){
  730. if(recode.rate != newValue.value){
  731. recode.rate = newValue.value;
  732. items.push({rateIndex:Index,rate:recode});
  733. }
  734. }
  735. }
  736. }
  737. }
  738. });
  739. projectObj.project.FeeRate.batchUpdateFeeRate(items,feeRateObject.activateFeeRate);
  740. },
  741. loadPageContent:function(){
  742. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  743. var usageProjects = feeRateFile.usageProjects;
  744. feeRateObject.setLocAndFeeRateSTD();
  745. $('#feeRateFileName').text(feeRateFile.name);
  746. $('#feeRateLibName').text(feeRateFile.libName);
  747. $('#projectCount').text(usageProjects.length);
  748. },
  749. setLocAndFeeRateSTD:function(){
  750. if(feeRateObject.feeRateSTDLoaded) return;
  751. let location = this.getLocation();
  752. $('#location').val(location);
  753. //养护的工程所在地下拉框不可选
  754. if(!commonUtil.isGLYun()) $('#location').attr("disabled","disabled");
  755. feeRateObject.setFeeRateSTD(location);
  756. feeRateObject.feeRateSTDLoaded = true;
  757. },
  758. getLocation:function(){
  759. let location = projectObj.project.projectInfo.location;
  760. if(!gljUtil.isDef(location)) location = defaultLocation;
  761. return location;
  762. },
  763. setFeeRateSTD(location){
  764. let feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  765. $('#feeRateStandard').empty();
  766. setOption(feeRateFile.libID,feeRateFile.libName)
  767. feeRateObject.getFeeRateStandards(function (data) {
  768. _.forEach(data,function (s) {
  769. if(s.ID != feeRateFile.libID){
  770. if(s.libName.startsWith("部颁")){
  771. setOption(s.ID,s.libName)
  772. }else {
  773. if(location){
  774. if(s.libName.startsWith(location)) setOption(s.ID,s.libName)
  775. }else{
  776. setOption(s.ID,s.libName)
  777. }
  778. }
  779. }
  780. })
  781. $('#feeRateStandard').val(feeRateFile.libID);
  782. });
  783. function setOption(ID,name){
  784. var option = $("<option>").val(ID).text(name);
  785. $('#feeRateStandard').append(option);
  786. }
  787. },
  788. loadLocationList:function(){
  789. let htmlS = "<option></option>";
  790. for(let l of locationList){
  791. htmlS += `<option value='${l}'>${l} </option>`
  792. }
  793. $('#location').html(htmlS)
  794. },
  795. loadFeeRateSelection:function() {
  796. if(!this.selectionLoad){
  797. var selectedID=0;
  798. _.forEach(projectObj.project.FeeRate.datas,function (data) {
  799. var option = $("<option>").val(data.ID).text(data.libName);
  800. $('#inlineFormCustomSelect').append(option);
  801. if(data.status=='activate'){
  802. selectedID=data.ID;
  803. }
  804. })
  805. $('#inlineFormCustomSelect').val(selectedID);
  806. }
  807. },
  808. getFeeRateStandards:function (callback) {
  809. if(feeRateObject.feeRateSTDList.length == 0){//没有的话发送请求,存在的话直接返回
  810. CommonAjax.post('/feeRates/getFeeRateStandards', {"projectID": projectObj.project.ID()}, function (data) {
  811. if (data) {
  812. feeRateObject.feeRateSTDList = data;
  813. callback(data);
  814. }
  815. });
  816. }else{
  817. callback(feeRateObject.feeRateSTDList);
  818. }
  819. },
  820. changeFeeRateStandard:function(newVal){
  821. $.bootstrapLoading.start();
  822. var callback=function () {
  823. feeRateObject.reFreshRateViews();
  824. feeRateObject.setFeeRateSTD($("#location").val());
  825. $.bootstrapLoading.end();
  826. };
  827. projectObj.project.FeeRate.changeFeeRateStandard(newVal,callback);
  828. },
  829. checkFeeRateName:function (newVal) {
  830. if(!newVal||newVal==""){
  831. //$('#saveAsConfirm').attr("disabled","disabled");
  832. $('#nameError').text("请输入文件名称。").show();
  833. return;
  834. }
  835. var callback=function (data) {
  836. if(data){
  837. // $('#saveAsConfirm').attr("disabled","disabled");
  838. $('#nameError').text("已存在同名费率文件。").show();
  839. $('#valid_name').val('');
  840. }else {
  841. $('#valid_name').val(newVal);
  842. $('#saveAsConfirm').removeAttr("disabled");
  843. $('#nameError').hide();
  844. }
  845. };
  846. projectObj.project.FeeRate.checkFeeRateName(newVal,callback);
  847. },
  848. feeRateFileSaveAs:function (newName) {
  849. if(!newName||newName==""){
  850. // $('#saveAsConfirm').attr("disabled","disabled");
  851. $('#nameError').text("请输入文件名称。").show();
  852. return;
  853. }
  854. let callback=function (data) {
  855. if(data){
  856. // $('#saveAsConfirm').attr("disabled","disabled");
  857. $('#nameError').text("已存在同名费率文件。").show();
  858. $('#valid_name').val('');
  859. }else {
  860. feeRateObject.submitSaveAs(newName);
  861. }
  862. }
  863. projectObj.project.FeeRate.checkFeeRateName(newName,callback);
  864. /* let valideName = $('#valid_name').val();
  865. if(valideName==''||valideName!==newName){
  866. }else {
  867. feeRateObject.submitSaveAs(newName);
  868. }*/
  869. },
  870. submitSaveAs:function (newName) {
  871. let me = this;
  872. let FeeRate = projectObj.project.FeeRate;
  873. FeeRate.feeRateFileSaveAs(newName,function (result) {
  874. me.activateFeeRate = result;
  875. me.loadPageContent();
  876. $('#copy-lv').modal('hide');
  877. let data ={
  878. projectID:projectObj.project.ID(),
  879. oldRoom:socketObject.roomInfo.feeRate,
  880. newRoom: FeeRate.getActivateFeeRateFileID(),
  881. userID:userID,
  882. name:'feeRate'
  883. };
  884. socket.emit('changeNewRoom',data);
  885. socketObject.roomInfo.feeRate = FeeRate.getActivateFeeRateFileID();
  886. $.bootstrapLoading.end();
  887. });
  888. },
  889. getChangeInfo:function () {
  890. var me = this;
  891. var callback=function (data) {
  892. me.changeInfo=data;
  893. me.loadChangePageContent(data);
  894. };
  895. projectObj.project.FeeRate.getChangeInfo(callback);
  896. },
  897. loadChangePageContent:function (data) {
  898. $('#currentProject').text(data.currentProject.name);
  899. $('#currentOptions').empty();
  900. _.forEach(data.currentProject.currentOptions,function (s) {
  901. var option = $("<option>").val(s.ID).text(s.name);
  902. $('#currentOptions').append(option);
  903. })
  904. $('#otherProject').empty();
  905. _.forEach(data.others,function (p) {
  906. var option = $("<option>").val(p.ID).text(p.name);
  907. $('#otherProject').append(option);
  908. });
  909. $('#otherFeeRateOption').empty();
  910. if(data.others.length>0){
  911. _.forEach(data.others[0].optionList,function (f) {
  912. var option = $("<option>").val(f.ID).text(f.name);
  913. $('#otherFeeRateOption').append(option);
  914. });
  915. }
  916. },
  917. changeFeeRateFileFromCurrent:function(){
  918. $.bootstrapLoading.start();
  919. var newVal = $("#currentOptions").val();
  920. if(!$("#currentOptions").val()){
  921. if($.bootstrapLoading.isLoading()){
  922. $.bootstrapLoading.end();
  923. }
  924. alert('费率文件不可为空');
  925. return;
  926. }
  927. if($("#currentOptions").val()==this.activateFeeRate.ID){
  928. return;
  929. }
  930. var name =$("#currentOptions").find("option:selected").text();
  931. var newFeeRateFile = {
  932. id:newVal,
  933. name:name
  934. }
  935. var callback=function () {
  936. feeRateObject.reFreshRateViews();
  937. projectObj.project.FeeRate.onFeeRateFileChange();
  938. $.bootstrapLoading.end();
  939. }
  940. projectObj.project.FeeRate.changeFeeRateFileFromCurrent(newFeeRateFile,callback);
  941. },
  942. changeFeeRateFileFromOthers:function () {
  943. var feeRateFileID = $("#otherFeeRateOption").val();
  944. var name =$("#otherFeeRateOption").find("option:selected").text();
  945. if(null===feeRateFileID){
  946. alert("请选择一个费率文件!");
  947. return;
  948. }
  949. var callback=function (data) {
  950. if(data){
  951. //$('#renameConfirm').attr("disabled","disabled");
  952. $('#renameError').text("本建设项目中已存在同名费率文件。").show();
  953. $('#rename-lv').modal('show');
  954. $("#newFeeRateID").val(feeRateFileID);
  955. $("#newFeeRateName").val(name);
  956. }else {
  957. //$('#renameConfirm').removeAttr("disabled");
  958. $('#renameError').hide();
  959. feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
  960. }
  961. };
  962. projectObj.project.FeeRate.checkFeeRateName(name,callback);
  963. /* var currentOption = _.find(this.changeInfo.currentProject.currentOptions,{name:name})
  964. if(currentOption){
  965. $("#rename-lv").modal({show:true});
  966. $("#newFeeRateID").val(feeRateFileID);
  967. $("#newFeeRateName").val(name);
  968. }else {
  969. this.changeFeeRateFileConfirm(feeRateFileID,name);
  970. }*/
  971. },
  972. changeFeeRateFileConfirm:function(feeRateFileID,name){
  973. $.bootstrapLoading.start();
  974. var callback=function () {
  975. feeRateObject.reFreshRateViews();
  976. projectObj.project.FeeRate.onFeeRateFileChange();
  977. $.bootstrapLoading.end();
  978. }
  979. projectObj.project.FeeRate.changeFeeRateFileFromOthers(feeRateFileID,name,callback);
  980. },
  981. setFeeRateCellCol:function (sheet,col) {
  982. sheet.getRange(-1, col, -1, 1).cellType(this.getFeeRateEditCellType());
  983. },
  984. onCellClick:function (sender,args) {
  985. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  986. feeRateObject.feeRateSelection=data[args.row];
  987. },
  988. onCellDoubleClick:function (sender,args) {
  989. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  990. feeRateObject.feeRateSelection=data[args.row];
  991. feeRateObject.submitFeeRateBySelect();
  992. },
  993. checkSelectedFeeRate:function () {
  994. var validate = false;
  995. var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
  996. if(feeRateObject.feeRateSelection!=null){
  997. var children=_.filter(data,{'ParentID':feeRateObject.feeRateSelection.ID});
  998. validate=children&&children.length==0;
  999. }
  1000. return validate;
  1001. },
  1002. submitFeeRateFromBill:function () {
  1003. var rate = feeRateObject.feeRateSelection;
  1004. var selected = projectObj.project.mainTree.selected;
  1005. if(selected.data.feeRateID === parseInt(rate.ID)) return $("#calcBaseFeeRate").modal('hide');
  1006. $.bootstrapLoading.start();
  1007. projectObj.project.FeeRate.submitFeeRateFromBill(rate,selected.data,function (data) {
  1008. selected.updateData.feeRateID= parseInt(rate.ID);
  1009. selected.updateData.feeRate=scMathUtil.roundToString(rate.rate,getDecimal("feeRate"));
  1010. selected.changed = true;
  1011. projectObj.project.calcProgram.calcAndSave(selected);
  1012. $("#calcBaseFeeRate").modal('hide');
  1013. $.bootstrapLoading.end();
  1014. });
  1015. },
  1016. submitFeeRateFromCalc:function () {
  1017. var rate = feeRateObject.feeRateSelection;
  1018. var calInfo = calcProgramManage.getSelectionInfo();
  1019. calInfo.calcItem.feeRateID=rate.ID;
  1020. calInfo.calcItem.feeRate=null;
  1021. var data={'projectID': projectObj.project.ID(),'templatesID': calInfo.template.ID,'calcItem': calInfo.calcItem};
  1022. $.bootstrapLoading.start();
  1023. calcProgramManage.saveCalcItem(data,function (result) {
  1024. calInfo.calcItem.feeRate=rate.rate;
  1025. projectObj.project.calcProgram.compileAllTemps();
  1026. projectObj.project.calcProgram.calcAllNodesAndSave();
  1027. calcProgramManage.refreshDetailSheet();
  1028. $("#calcBaseFeeRate").modal('hide');
  1029. $.bootstrapLoading.end();
  1030. });
  1031. console.log(calInfo);
  1032. },
  1033. submitFeeRateBySelect:function () {
  1034. var validate = this.checkSelectedFeeRate();
  1035. if(validate){
  1036. if($('#edit_from').val()=='calc_detail'){
  1037. this.submitFeeRateFromCalc();
  1038. }else {
  1039. this.submitFeeRateFromBill();
  1040. }
  1041. }else {
  1042. //$("#fee_rate_tree").modal('hide');
  1043. }
  1044. }
  1045. }
  1046. function getPopoverContent() {
  1047. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1048. var usageProjects = feeRateFile.usageProjects;
  1049. let names = _.map(usageProjects,'name');
  1050. let popover_content = names.join('<br>');
  1051. return "费率的变化,将自动影响以下单位工程造价:<br>"+ popover_content;
  1052. }
  1053. $(function(){
  1054. $('#pop-lv').tooltip({
  1055. placement:"bottom",
  1056. html:true,
  1057. trigger:"hover | focus",
  1058. title:getPopoverContent
  1059. }
  1060. );
  1061. feeRateObject.loadLocationList();
  1062. $('#tab_fee_rate').on('shown.bs.tab', function (e) {
  1063. sessionStorage.setItem('mainTab', '#tab_fee_rate');
  1064. let me = feeRateObject;
  1065. $(e.relatedTarget.hash).removeClass('active');
  1066. if(me.mainFeeRateSpread == null) me.initFeeRateSpread(0);
  1067. subRateObject.initSubRateSpread();
  1068. me.showMainFeeRateData();
  1069. me.loadPageContent();
  1070. });
  1071. //切换选择工程所在地
  1072. $('#location').change(async function () {
  1073. //console.log(this.value);
  1074. let updateData = {type:ModuleNames.project,isInfo:true,data:{'ID' : projectObj.project.ID(),location:this.value}};//,'property.locateSetting':outstd
  1075. $.bootstrapLoading.start();
  1076. await projectObj.project.syncUpdateNodesAndRefresh([updateData]);
  1077. feeRateObject.setFeeRateSTD(this.value);
  1078. subRateObject.showSubRateData();
  1079. $.bootstrapLoading.end();
  1080. });
  1081. //切换费率标准
  1082. $('#feeRateStandard').change(async function () {
  1083. feeRateObject.changeFeeRateStandard(this.value);
  1084. });
  1085. $('#setNewFeeRate').bind('click', function () {
  1086. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1087. var usageProjects = feeRateFile.usageProjects;
  1088. var listString ='';
  1089. _.forEach(usageProjects,function (u) {
  1090. listString+="<li>"+u.name+"</li>"
  1091. })
  1092. $("#usageProjectList").html(listString);
  1093. $("#set-lv-feeRateName").text(feeRateFile.name);
  1094. $("#set-use-feeRateName").text(feeRateFile.name);
  1095. feeRateObject.getFeeRateStandards(function (data) {
  1096. $('#standardSelect').empty();
  1097. _.forEach(data,function (s) {
  1098. var option = $("<option>").val(s.ID).text(s.libName);
  1099. $('#standardSelect').append(option);
  1100. })
  1101. $('#standardSelect').val(feeRateFile.libID);
  1102. });
  1103. });
  1104. $('#changeConfirm').bind('click', function (){
  1105. var newVal=$('#standardSelect').val();
  1106. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1107. feeRateObject.changeFeeRateStandard(newVal);
  1108. //这里改成不判断了,只是点击确定了就重选
  1109. //if(newVal&&newVal!=feeRateFile.libID) feeRateObject.changeFeeRateStandard(newVal);
  1110. });
  1111. $('#save-as').bind('click', function (){
  1112. var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
  1113. $('#copyFeeRateName').val(feeRateFile.name+'副本');
  1114. $('#valid_name').val(feeRateFile.name+'副本');
  1115. $('#nameError').hide();
  1116. });
  1117. $('#saveAsConfirm').bind('click',function () {
  1118. feeRateObject.feeRateFileSaveAs($('#copyFeeRateName').val());
  1119. })
  1120. $('#copyFeeRateName').change(function () {
  1121. feeRateObject.checkFeeRateName(this.value);
  1122. });
  1123. $('#newFeeRateName').change(function () {
  1124. var newName = $(this).val();
  1125. if(!newName||newName==""){
  1126. //$('#renameConfirm').attr("disabled","disabled");
  1127. $('#renameError').text("请输入文件名称。").show();
  1128. return;
  1129. }
  1130. var callback=function (data) {
  1131. if(data){
  1132. //$('#renameConfirm').attr("disabled","disabled");
  1133. $('#renameError').text("本建设项目中已存在同名费率文件。").show();
  1134. }else {
  1135. //$('#renameConfirm').removeAttr("disabled");
  1136. $('#renameError').hide();
  1137. }
  1138. };
  1139. projectObj.project.FeeRate.checkFeeRateName(newName,callback);
  1140. });
  1141. $('#changeFeeRateConfirm').bind('click',function (){
  1142. var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
  1143. if(radioV==='0'){
  1144. feeRateObject.changeFeeRateFileFromCurrent();
  1145. }else {
  1146. feeRateObject.changeFeeRateFileFromOthers();
  1147. }
  1148. })
  1149. $('#changFeeRateFile').bind('click',function (){
  1150. $("input[name='chaneg-lv-Radio']")[0].checked=true;
  1151. $("#fromProject").show();
  1152. $("#fromOther").hide();
  1153. feeRateObject.getChangeInfo();
  1154. })
  1155. $('#otherProject').change(function(){
  1156. var newVal = $(this).val();
  1157. var projects = feeRateObject.changeInfo.others;
  1158. var selected = _.find(projects,{ID:parseInt(newVal)});
  1159. $('#otherFeeRateOption').empty();
  1160. _.forEach(selected.optionList,function (f) {
  1161. var option = $("<option>").val(f.ID).text(f.name);
  1162. $('#otherFeeRateOption').append(option);
  1163. });
  1164. })
  1165. $('#renameConfirm').bind('click',function (){
  1166. var feeRateFileID= $("#newFeeRateID").val();
  1167. var name = $("#newFeeRateName").val();
  1168. var callback=function (data) {
  1169. if(data){
  1170. $('#renameError').text("已存在同名费率文件。").show();
  1171. $("#newFeeRateID").val(feeRateFileID);
  1172. $("#newFeeRateName").val(name);
  1173. }else {
  1174. $('#renameError').hide();
  1175. $('#rename-lv').modal('hide');
  1176. feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
  1177. }
  1178. };
  1179. projectObj.project.FeeRate.checkFeeRateName(name,callback);
  1180. })
  1181. $('#inlineFormCustomSelect').change(function(){
  1182. var updateTask = [];
  1183. var selectID = $(this).val();
  1184. var oldValue=0;
  1185. _.forEach(projectObj.project.FeeRate.datas,function (feeRate) {
  1186. if(feeRate.status=='activate'){
  1187. oldValue=feeRate.ID;
  1188. }
  1189. if(feeRate.ID ==selectID){
  1190. feeRate.status='activate';
  1191. }else {
  1192. feeRate.status='disable';
  1193. }
  1194. updateTask.push({query:{ID:feeRate.feeRateID},doc:{status:feeRate.status}});
  1195. })
  1196. projectObj.project.FeeRate.updateStatusBySelected(updateTask);
  1197. feeRateObject.createSpreadView();
  1198. subRateObject.destorySpreadView();
  1199. socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
  1200. })
  1201. $('#calcBaseFeeRate').on('shown.bs.modal', function (e) {
  1202. let toggle = $('#calcBaseFeeRateConf').attr('toggle');
  1203. if(feeRateObject.feeRateSpreads==null){
  1204. feeRateObject.createSheet();
  1205. }
  1206. feeRateObject.initFeeRateEditDiv();
  1207. feeRateObject.feeRateSelection=null;
  1208. feeRateObject.showFeeRateTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
  1209. feeRateObject.locate();
  1210. feeRateObject.feeRateSpreads.refresh();
  1211. });
  1212. $('#tabFeeRate').on('shown.bs.tab', function () {
  1213. if(feeRateObject.feeRateSpreads){
  1214. feeRateObject.feeRateSpreads.refresh();
  1215. }
  1216. });
  1217. $('#calcBaseFeeRate').on('hidden.bs.modal', function (e) {
  1218. if(feeRateObject.feeRateSpreads){
  1219. feeRateObject.feeRateSpreads.destroy();
  1220. feeRateObject.feeRateSpreads=null;
  1221. $('#edit_from').val('');
  1222. $('#edit_row').val('');
  1223. }
  1224. });
  1225. //fee_selected_conf
  1226. $('#calcBaseFeeRateConf').bind('click',function (){
  1227. let toggle = $(this).attr('toggle');
  1228. if(!toggle || toggle !== 'feeRate'){
  1229. return;
  1230. }
  1231. feeRateObject.submitFeeRateBySelect();
  1232. });
  1233. $("input[name='editFeeRateOptions']").each(function(){
  1234. $(this).click(function(){
  1235. let optins = $(this).val();
  1236. if(optins == "0"){
  1237. $("#selfDiv").show();
  1238. $("#fee_rate_sheet").hide();
  1239. }else {
  1240. $("#selfDiv").hide();
  1241. $("#fee_rate_sheet").show(function () {
  1242. feeRateObject.feeRateSpreads.refresh();
  1243. });
  1244. }
  1245. });
  1246. });
  1247. })
  1248. function changeFRadioClick() {
  1249. var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
  1250. if(radioV==='0'){
  1251. $("#fromProject").show();
  1252. $("#fromOther").hide();
  1253. }else {
  1254. $("#fromProject").hide();
  1255. $("#fromOther").show();
  1256. }
  1257. }