sub_fee_rate_views.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /**
  2. * Created by chen on 2017/8/1.
  3. */
  4. var subRateObject={
  5. views:null,
  6. datas:null,
  7. valueMap:null,
  8. canEdit:true,
  9. subRateSpread:null,
  10. subRateSheet:null,
  11. subRateSetting:{
  12. header: [
  13. {headerName: "参数名称", headerWidth: 110, dataCode: "name", dataType: "String"},
  14. {headerName: "参数值", headerWidth: 150, dataCode: "optionValue", dataType: "String",getText:'forOption'}
  15. ],
  16. view: {
  17. lockColumns: [0]
  18. },
  19. getText:{
  20. forOption:function (item,val) {
  21. let o = _.find(item.optionList,{'selected':true});
  22. return o?o.value:'';
  23. }
  24. }
  25. },
  26. columns: [
  27. {
  28. id: 'name',
  29. caption: '参数名称',
  30. dataField: 'name',
  31. width: 250,
  32. allowEditing: false
  33. },
  34. {
  35. id: 'typeName',
  36. caption: '参数值',
  37. dataField: 'typeName',
  38. width: 200,
  39. minWidth: 50,
  40. allowEditing: true,
  41. presenter:'<div><select class="form-control form-control-sm" id="{{=it.ID}}" onchange="subRateObject.subRateChange(this)" style="width: 100%"> </select></div>'
  42. },
  43. {
  44. id: 'ID',
  45. caption: 'ID',
  46. dataField: 'ID',
  47. width: 80,
  48. visible: false,
  49. allowEditing: false
  50. }
  51. ],
  52. options :{
  53. allowSorting: false,
  54. showRowHeader: true,
  55. colMinWidth: 80,
  56. rowHeight: 33,
  57. allowEditing: this.canEdit,
  58. editMode: 'inline',
  59. editUnit: 'cell',
  60. selectionUnit:(this.canEdit == true) ? "cell" : "row"
  61. },
  62. createSpreadView:function () {
  63. if (this.views) {
  64. this.views.destroy();
  65. this.views = null;
  66. }
  67. this.views = new GC.Spread.Views.DataView($('#subRate')[0],
  68. this.datas, this.columns, new GC.Spread.Views.Plugins.GridLayout(this.options));
  69. this.views["rowDbClick"].addHandler(function () {
  70. console.log('hh')
  71. });
  72. this.views.invalidate();
  73. document.querySelector('#subRate').focus();
  74. this.addComboboxOption(this.datas);
  75. },
  76. reFreshRateViews:function(sender,args) {
  77. subRateObject.datas = projectObj.project.FeeRate.getSubViewData(args.item);
  78. subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(args.item);
  79. subRateObject.createSpreadView();
  80. },
  81. initSubRateSpread:function (item) {
  82. if(this.subRateSpread == null){
  83. this.subRateSpread = SheetDataHelper.createNewSpread($("#subRate")[0]);
  84. sheetCommonObj.spreadDefaultStyle(this.subRateSpread);
  85. this.subRateSheet = this.subRateSpread.getSheet(0);
  86. sheetCommonObj.initSheet(this.subRateSheet, this.subRateSetting, 30);
  87. this.subRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSubRateSelectChanged);
  88. this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSubRateValueChange);
  89. //this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onSheetValueChange);
  90. this.subRateSheet.name('subRateSheet');
  91. }
  92. /* 20201209 改成和公路一样
  93. subRateObject.datas = projectObj.project.FeeRate.getSubViewData(item);
  94. subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(item);
  95. */
  96. subRateObject.showSubRateData();
  97. disableRightMenu("subRate",this.subRateSpread);
  98. if(projectReadOnly){
  99. if(this.subRateSetting.view.lockColumns){
  100. this.subRateSetting.view.lockColumns = null;
  101. }
  102. sheetCommonObj.disableSpread(this.subRateSpread);
  103. }
  104. },
  105. /* 20201209 改成和公路一样
  106. showSubRateData:function () {
  107. this.subRateSheet.setRowCount(0);
  108. sheetCommonObj.showData(this.subRateSheet, this.subRateSetting, this.datas);
  109. this.subRateSheet.setRowCount(this.datas.length);
  110. for(let row =0; row < this.datas.length;row++){
  111. this.setComboOptionCell(row,1,this.datas[row],this.subRateSheet);
  112. }
  113. }, */
  114. showSubRateData:function () {
  115. let preSelections = this.subRateSheet.getSelections();
  116. this.datas = projectObj.project.FeeRate.getAllSubRates();
  117. this.subRateSheet.setRowCount(0);
  118. sheetCommonObj.showData(this.subRateSheet, this.subRateSetting, this.datas);
  119. this.subRateSheet.setRowCount(this.datas.length);
  120. let parentMap=_.groupBy(this.datas, 'ParentID');
  121. let visibleMap = {};
  122. this.subRateSheet.suspendPaint();
  123. this.subRateSheet.suspendEvent();
  124. for(let row =0; row < this.datas.length;row++){
  125. this.setComboOptionCell(row,1,this.datas[row],this.subRateSheet);
  126. this.setTreeNodeCellType(this.datas,row,parentMap,visibleMap,this.subRateSheet);
  127. }
  128. this.subRateSheet.resumeEvent();
  129. this.subRateSheet.resumePaint();
  130. if(preSelections){//定位光标到之前的位置
  131. this.subRateSheet.setSelection(preSelections[0].row,preSelections[0].col,preSelections[0].rowCount,preSelections[0].colCount);
  132. }
  133. },
  134. onSubRateSelectChanged:function (e,info) {
  135. info.sheet.repaint();
  136. },
  137. setTreeNodeCellType:function (datas,row,parentMap,visibleMap,sheet) {
  138. delete parentMap.undefined;//去掉无用节点
  139. let treeNode = sheetCommonObj.getTreeNodeCellType(datas,row,parentMap);
  140. treeNode.treeNodeType = false;
  141. if((datas[row].subList && datas[row].subList.length >0)||datas[row].isSub == true ){
  142. treeNode.treeNodeType = true;
  143. visibleMap[datas[row].ID] = treeNode.collapsed;
  144. }
  145. sheet.setCellType(row, 0, treeNode, GC.Spread.Sheets.SheetArea.viewport);
  146. if(visibleMap[datas[row].ParentID]) sheet.getRange(row , -1, 1, -1).visible(!visibleMap[datas[row].ParentID]);//显示或隐藏
  147. },
  148. setComboOptionCell:function(row,col,subRate,sheet){
  149. let options=[];
  150. for(let op of subRate.optionList){
  151. options.push({text:op.name,value:op.value});
  152. }
  153. let dynamicCombo = sheetCommonObj.getDynamicCombo();//new GC.Spread.Sheets.CellTypes.ComboBox();
  154. dynamicCombo.items(options);
  155. dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
  156. sheet.setCellType(row, col, dynamicCombo, GC.Spread.Sheets.SheetArea.viewport);
  157. },
  158. addComboboxOption:function (datas) {
  159. _.forEach(datas,function (item) {
  160. var selectvalue = 0;
  161. _.forEach(item.optionList,function (o) {
  162. var option = $("<option>").val(o.value).text(o.name);
  163. $('#'+item.ID).append(option);
  164. if(o.selected){
  165. selectvalue = o.value;
  166. }
  167. })
  168. $('#'+item.ID).val(selectvalue);
  169. })
  170. },
  171. subRateChange:function(select){
  172. let me = subRateObject;
  173. let selectValueList=[];
  174. let selectMap={};
  175. if(me.datas&&me.datas.length>0){
  176. $.bootstrapLoading.start();
  177. _.forEach(me.datas,function (d,key) {
  178. let selectValue = $('#'+d.ID).val();
  179. selectValueList.push(selectValue);
  180. selectMap[key]=selectValue;
  181. })
  182. let mapID =selectValueList.join('-');
  183. let rate = me.valueMap[mapID];
  184. feeRateObject.updateBySelect(rate,selectMap,mapID);
  185. }
  186. },
  187. /*
  188. 20201209 改成和公路一样
  189. onSubRateValueChange:function (e,info) {
  190. console.info(info);
  191. let me = subRateObject, selectValueList=[],selectMap={};
  192. if(me.datas&&me.datas.length>0){
  193. _.forEach(me.datas,function (d,key) {
  194. if(info.row == key){
  195. selectMap[key]=info.newValue;
  196. }else {
  197. let o = _.find(d.optionList,{'selected':true});
  198. selectMap[key]=o.value;
  199. }
  200. selectValueList.push(selectMap[key]);
  201. })
  202. let mapID =selectValueList.join('-');
  203. let rate = me.valueMap[mapID];
  204. feeRateObject.updateBySelect(rate,selectMap,mapID);
  205. }
  206. },
  207. */
  208. onSubRateValueChange:function (e,info,feeRateCoe) {
  209. let me = subRateObject, subList=null;
  210. let value = info.newValue;
  211. let subRate = me.datas[info.row];
  212. if(subRate.editable == true || subRate.isSub == true){//是可编辑的,要检查数据类型
  213. let checkResult = scMathUtil.isNumOrFormula(value);
  214. if(checkResult!=null && !isNaN(checkResult)){
  215. value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate"));
  216. }else {
  217. alert('当前输入的数据类型不正确,请重新输入。');
  218. return me.showSubRateData();
  219. }
  220. }
  221. if(subRate.isSub == true){//是树节点的子节点,计算父节点的值
  222. let parentRate = _.find(me.datas,{"ID":subRate.ParentID});//找到父节点
  223. if(parentRate){
  224. let sum = 0;
  225. subList = _.cloneDeep(parentRate.subList);
  226. for(let s of subList){//按比例计算
  227. if(s.ID == subRate.ID) s.value = value;//当前项要用新输入的值
  228. let v_a = scMathUtil.roundForObj(s.value * s.amount,getDecimal("process"))
  229. sum = scMathUtil.roundForObj(sum + v_a,getDecimal("feeRate"));
  230. }
  231. value = sum;
  232. subRate = parentRate;//把subRate 指向parentRate
  233. }
  234. } else if(subRate.subList && subRate.subList.length > 0){//输入树节结的父结点,子结点都等于父节点的值
  235. subList = _.cloneDeep(subRate.subList);
  236. for(let t of subList){
  237. t.value = value
  238. }
  239. }
  240. if(me.timeStamp = null){
  241. me.timeStamp = +new Date()
  242. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  243. }else {
  244. let now = +new Date();
  245. if(now - me.timeStamp < 500){
  246. setTimeout(function () {
  247. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  248. },500)
  249. }else {
  250. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  251. }
  252. me.timeStamp = now;
  253. }
  254. },
  255. destorySpreadView:function () {
  256. if(this.views){
  257. this.views.destroy();
  258. this.views = null;
  259. }
  260. subRateObject.datas=null;
  261. subRateObject.valueMap=null;
  262. }
  263. }