sub_fee_rate_views.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /**
  2. * Created by chen on 2017/8/1.
  3. */
  4. var subRateObject={
  5. views:null,
  6. datas:null,
  7. timeStamp:null,
  8. valueMap:null,
  9. canEdit:true,
  10. subRateSpread:null,
  11. subRateSheet:null,
  12. subRateSetting:{
  13. header: [
  14. {headerName: "参数名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  15. {headerName: "参数值", headerWidth: 150, dataCode: "optionValue", dataType: "String",getText:'forOption'}
  16. ],
  17. view: {
  18. lockColumns: [0]
  19. },
  20. getText:{
  21. forOption:function (item,val) {
  22. if(item.isSub == true) return item.value;//可编辑子节点
  23. let o = _.find(item.optionList,{'selected':true});
  24. if(gljUtil.isDef(o)){
  25. return o.name;
  26. }else {
  27. if(item.editable==true) return item.value;
  28. }
  29. }
  30. }
  31. },
  32. options :{
  33. allowSorting: false,
  34. showRowHeader: true,
  35. colMinWidth: 80,
  36. rowHeight: 33,
  37. allowEditing: this.canEdit,
  38. editMode: 'inline',
  39. editUnit: 'cell',
  40. selectionUnit:(this.canEdit == true) ? "cell" : "row"
  41. },
  42. initSubRateSpread:function (item) {
  43. if(this.subRateSpread == null){
  44. this.subRateSpread = SheetDataHelper.createNewSpread($("#subRate")[0]);
  45. sheetCommonObj.spreadDefaultStyle(this.subRateSpread);
  46. this.subRateSheet = this.subRateSpread.getSheet(0);
  47. sheetCommonObj.initSheet(this.subRateSheet, this.subRateSetting, 30);
  48. this.subRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSubRateSelectChanged);
  49. this.subRateSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onSubRateEditStarting);
  50. this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSubRateValueChange);
  51. //this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onSheetValueChange);
  52. this.subRateSheet.name('subRateSheet');
  53. }
  54. //subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(item);
  55. subRateObject.showSubRateData();
  56. if(projectReadOnly){
  57. if(this.subRateSetting.view.lockColumns){
  58. this.subRateSetting.view.lockColumns = null;
  59. }
  60. sheetCommonObj.disableSpread(this.subRateSpread);
  61. disableRightMenu("subRate",this.subRateSpread);
  62. }else {
  63. this.initRightClick("subRate",this.subRateSpread)
  64. }
  65. },
  66. showSubRateData:function () {
  67. let preSelections = this.subRateSheet.getSelections();
  68. this.datas = projectObj.project.FeeRate.getAllSubRates();
  69. this.subRateSheet.setRowCount(0);
  70. sheetCommonObj.showData(this.subRateSheet, this.subRateSetting, this.datas);
  71. this.subRateSheet.setRowCount(this.datas.length);
  72. let parentMap=_.groupBy(this.datas, 'ParentID');
  73. let visibleMap = {};
  74. this.subRateSheet.suspendPaint();
  75. this.subRateSheet.suspendEvent();
  76. for(let row =0; row < this.datas.length;row++){
  77. this.setComboOptionCell(row,1,this.datas[row],this.subRateSheet,this.datas[row].name);
  78. this.setTreeNodeCellType(this.datas,row,parentMap,visibleMap,this.subRateSheet);
  79. }
  80. this.subRateSheet.resumeEvent();
  81. this.subRateSheet.resumePaint();
  82. if(preSelections){//定位光标到之前的位置
  83. this.subRateSheet.setSelection(preSelections[0].row,preSelections[0].col,preSelections[0].rowCount,preSelections[0].colCount);
  84. }
  85. },
  86. onSubRateSelectChanged:function (e,info) {
  87. info.sheet.repaint();
  88. },
  89. getAreaTips:function(name){
  90. let field = name === "冬季施工"?"temperatureArea":"rainfallArea";
  91. let location = feeRateObject.getLocation();
  92. let area = feeRateAreaMap[location];
  93. return area && area[field]? area[field]:null;
  94. },
  95. setTreeNodeCellType:function (datas,row,parentMap,visibleMap,sheet) {
  96. delete parentMap.undefined;//去掉无用节点
  97. let treeNode = null;
  98. if(datas[row].name == "冬季施工" || datas[row].name == "雨季施工"){
  99. treeNode = sheetCommonObj.getTreeNodeCellType(datas,row,parentMap,null,null,this.getAreaTips(datas[row].name));
  100. }else{
  101. treeNode = sheetCommonObj.getTreeNodeCellType(datas,row,parentMap);
  102. }
  103. treeNode.treeNodeType = false;
  104. if((datas[row].subList && datas[row].subList.length >0)||datas[row].isSub == true ){
  105. treeNode.treeNodeType = true;
  106. visibleMap[datas[row].ID] = treeNode.collapsed;
  107. }
  108. sheet.setCellType(row, 0, treeNode, GC.Spread.Sheets.SheetArea.viewport);
  109. if(visibleMap[datas[row].ParentID]) sheet.getRange(row , -1, 1, -1).visible(!visibleMap[datas[row].ParentID]);//显示或隐藏
  110. },
  111. setComboOptionCell:function(row,col,subRate,sheet,name){
  112. let options=[];
  113. if(subRate.isSub == true) return;//是树节点的子节点;
  114. for(let op of subRate.optionList){
  115. options.push(op.name);
  116. }
  117. let dynamicCombo =null;
  118. if(name == "冬季施工" || name == "雨季施工"){
  119. let tips = this.getAreaTips(name)
  120. dynamicCombo = sheetCommonObj.getTipsCombo(true, tips, {})
  121. }else{
  122. dynamicCombo = sheetCommonObj.getDynamicCombo();//new GC.Spread.Sheets.CellTypes.ComboBox();
  123. }
  124. dynamicCombo.items(options);
  125. if(subRate.editable == true) dynamicCombo.editable(true);
  126. sheet.setCellType(row, col, dynamicCombo, GC.Spread.Sheets.SheetArea.viewport);
  127. },
  128. addComboboxOption:function (datas) {
  129. _.forEach(datas,function (item) {
  130. var selectvalue = 0;
  131. _.forEach(item.optionList,function (o) {
  132. var option = $("<option>").val(o.value).text(o.name);
  133. $('#'+item.ID).append(option);
  134. if(o.selected){
  135. selectvalue = o.value;
  136. }
  137. })
  138. $('#'+item.ID).val(selectvalue);
  139. })
  140. },
  141. onSubRateEditStarting :function(e,info){
  142. if($.bootstrapLoading.isLoading()) info.cancel = true;
  143. },
  144. onSubRateValueChange:function (e,info,feeRateCoe) {
  145. let me = subRateObject, subList=null;
  146. let value = info.newValue;
  147. let subRate = me.datas[info.row];
  148. if(subRate.editable == true || subRate.isSub == true){//是可编辑的,要检查数据类型
  149. let checkResult = scMathUtil.isNumOrFormula(value);
  150. if(checkResult!=null && !isNaN(checkResult)){
  151. value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate"));
  152. }else {
  153. alert('当前输入的数据类型不正确,请重新输入。');
  154. return me.showSubRateData();
  155. }
  156. }
  157. if(subRate.isSub == true){//是树节点的子节点,计算父节点的值
  158. let parentRate = _.find(me.datas,{"ID":subRate.ParentID});//找到父节点
  159. if(parentRate){
  160. let sum = 0;
  161. subList = _.cloneDeep(parentRate.subList);
  162. for(let s of subList){//按比例计算
  163. if(s.ID == subRate.ID) s.value = value;//当前项要用新输入的值
  164. let v_a = scMathUtil.roundForObj(s.value * s.amount,getDecimal("process"))
  165. sum = scMathUtil.roundForObj(sum + v_a,getDecimal("feeRate"));
  166. }
  167. value = sum;
  168. subRate = parentRate;//把subRate 指向parentRate
  169. }
  170. } else if(subRate.subList && subRate.subList.length > 0){//输入树节结的父结点,子结点都等于父节点的值
  171. subList = _.cloneDeep(subRate.subList);
  172. for(let t of subList){
  173. t.value = value
  174. }
  175. }
  176. if(me.timeStamp = null){
  177. me.timeStamp = +new Date()
  178. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  179. }else {
  180. let now = +new Date();
  181. if(now - me.timeStamp < 500){
  182. setTimeout(function () {
  183. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  184. },500)
  185. }else {
  186. feeRateObject.setRateFromSub(subRate,value,subList,info.newValue,feeRateCoe);
  187. }
  188. me.timeStamp = now;
  189. }
  190. },
  191. destorySpreadView:function () {
  192. if(this.views){
  193. this.views.destroy();
  194. this.views = null;
  195. }
  196. subRateObject.datas=null;
  197. subRateObject.valueMap=null;
  198. },
  199. initRightClick:function (id,spread) {
  200. let me = this;
  201. $.contextMenu({
  202. selector: '#'+id,
  203. build: function ($trigger, e) {
  204. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
  205. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  206. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  207. },
  208. items: {
  209. "widthCoe":{
  210. name: "乘系数",
  211. icon: 'fa-sign-in',
  212. visible:function () {
  213. return true;//2019-11-17 改成不需要右键插入功能 id == "freightSheet";
  214. },
  215. disabled: function (){
  216. let subRate = subRateObject.datas[me.rightClickTarget.row];
  217. if(subRate && subRate.isSub) return true;
  218. return me.rightClickTarget.row === undefined;
  219. },
  220. callback:function () {
  221. $("#width_coe_value").val(1);
  222. $("#widthCoeDiv").modal("show");
  223. }
  224. }
  225. }
  226. });
  227. }
  228. };
  229. $(function(){
  230. $("#widthCoeDivConfirm").click(function () {
  231. let feeRateCoe = $("#width_coe_value").val();
  232. if(!number_util.isNum(feeRateCoe)){
  233. alert("乘系数类型不对,请重新输入!");
  234. return ;
  235. }
  236. feeRateCoe = scMathUtil.roundForObj(feeRateCoe,getDecimal("feeRate"));
  237. let sub = subRateObject.subRateSheet.getSelections()[0];
  238. let value =subRateObject.subRateSheet.getCell(sub.row,1).value();
  239. let info = {col:1,row:sub.row,newValue:value,oldValue:value};
  240. subRateObject.onSubRateValueChange({},info,feeRateCoe);
  241. $("#widthCoeDiv").modal("hide");
  242. })
  243. });