gather_fees_view.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. let gatherFeesView = {
  2. datas: [],
  3. mainSpread: null,
  4. detailSpread: null,
  5. mainSheet: null,
  6. detailSheet: null,
  7. mainSetting: {
  8. header:[
  9. // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
  10. {headerName:"费用类别",headerWidth:120,dataCode:"name", dataType: "String"},
  11. {headerName:"金额",headerWidth:80,dataCode:"totalFee", dataType: "String",hAlign: "right"}
  12. ],
  13. view:{
  14. comboBox:[],
  15. lockColumns:[0,1],
  16. colHeaderHeight: CP_Col_Width.colHeader,
  17. rowHeaderWidth: CP_Col_Width.rowHeader
  18. }
  19. },
  20. detailSetting: {
  21. header:[
  22. // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
  23. {headerName:"费用代号",headerWidth:CP_Col_Width.code, dataCode:"code", dataType: "String"},
  24. {headerName:"费用名称",headerWidth:CP_Col_Width.name, dataCode:"name", dataType: "String"},
  25. {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String"},
  26. {headerName:"费率",headerWidth:CP_Col_Width.feeRate, dataCode:"feeRate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
  27. {headerName: "金额", headerWidth: CP_Col_Width.totalFee, dataCode: "totalFee", dataType: "Number"},
  28. {headerName:"费用类别",headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"},
  29. {headerName:"基数说明",headerWidth:CP_Col_Width.statement, dataCode:"statement", dataType: "String"},
  30. {headerName:"备注",headerWidth:CP_Col_Width.memo, dataCode:"memo", dataType: "String"}
  31. ],
  32. view:{
  33. comboBox:[],
  34. lockColumns:[0,1,2,3,4,5,6,7],
  35. colHeaderHeight: CP_Col_Width.colHeader,
  36. rowHeaderWidth: CP_Col_Width.rowHeader
  37. },
  38. //callback 和disable都是和 cusButton配套使用的
  39. callback:{
  40. calcBase:function (hitinfo) {
  41. calcBaseView.onCalcBaseButtonClick(hitinfo,'ration');
  42. }
  43. },
  44. disable:{
  45. calcBase:function (row,col) {
  46. return projectReadOnly || !calcBaseView.ifEdit('ration', row)
  47. }
  48. }
  49. },
  50. buildSheet: function (){
  51. let me = this;
  52. if (me.mainSpread) {
  53. me.mainSpread.destroy();
  54. me.mainSpread = null;
  55. };
  56. if (me.detailSpread) {
  57. me.detailSpread.destroy();
  58. me.detailSpread = null;
  59. };
  60. // me.mainSpread = sheetCommonObj.buildSheet($('#gfMainSpread')[0], me.mainSetting, me.datas.length);
  61. me.mainSpread = sheetCommonObj.buildSheet($('#gfMainSpread')[0], me.mainSetting, 1);
  62. me.mainSheet = me.mainSpread.getSheet(0);
  63. sheetCommonObj.spreadDefaultStyle(me.mainSpread);
  64. // me.detailSpread = sheetCommonObj.buildSheet($('#gfDetailSpread')[0], me.detailSetting, me.datas[0].calcItems.length);
  65. me.detailSpread = sheetCommonObj.buildSheet($('#gfDetailSpread')[0], me.detailSetting, 1);
  66. me.detailSheet = me.detailSpread.getSheet(0);
  67. sheetCommonObj.spreadDefaultStyle(me.detailSpread);
  68. me.mainSheet.bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell);
  69. me.detailSheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onDetailValueChanged);
  70. me.detailSheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
  71. me.detailSheet.bind(GC.Spread.Sheets.Events.EnterCell, me.onDetailEnterCell);
  72. me.detailSheet.name('gatherfee_detail');
  73. if(!projectReadOnly){
  74. // me.loadMainContextMenu();
  75. // me.loadDetailContextMenu();
  76. }
  77. else {
  78. if(me.mainSetting.view.lockColumns){
  79. me.mainSetting.view.lockColumns = null;
  80. }
  81. if(me.detailSetting.view.lockColumns){
  82. me.detailSetting.view.lockColumns = null;
  83. }
  84. sheetCommonObj.disableSpread(me.mainSpread);
  85. sheetCommonObj.disableSpread(me.detailSpread);
  86. };
  87. },
  88. showData: async function () {
  89. $.bootstrapLoading.start();
  90. let me = this;
  91. let obj = await projectObj.project.calcProgram.getGatherFeeData();
  92. me.datas = obj.calcPrograms;
  93. $('#lblGatherFee').text(`费用汇总 ${obj.totalFee}`);
  94. sheetCommonObj.showData(me.mainSheet, me.mainSetting, me.datas);
  95. me.mainSheet.setRowCount(me.datas.length);
  96. sheetCommonObj.showData(me.detailSheet, me.detailSetting, me.datas[0].calcItems);
  97. me.getfeeRateColor(me.datas[0].calcItems);
  98. customRowHeader(me.detailSheet, me.datas[0].calcItems.length);
  99. let count = gatherFeesView.datas[gatherFeesView.mainSheet.getActiveRowIndex()].calcItems.length;
  100. gatherFeesView.detailSheet.setRowCount(count, GC.Spread.Sheets.SheetArea.viewport);
  101. $.bootstrapLoading.end();
  102. },
  103. onMainEnterCell: function(sender, args) {
  104. var me = gatherFeesView;
  105. var row = args.sheet.getActiveRowIndex();
  106. me.detailSpread.suspendPaint();
  107. var dData = me.datas[row].calcItems;
  108. me.detailSheet.setRowCount(dData.length, GC.Spread.Sheets.SheetArea.viewport);
  109. sheetCommonObj.showData(me.detailSheet, me.detailSetting, dData);
  110. me.getfeeRateColor(dData);
  111. customRowHeader(me.detailSheet, dData.length);
  112. me.detailSpread.resumePaint();
  113. },
  114. onRangeChanged:function (sender,args) {
  115. let me = gatherFeesView;
  116. let editInfo= me.getSelectionInfo();
  117. let dataCode = me.detailSetting.header[args.col].dataCode;
  118. // if (args.action == GC.Spread.Sheets.RangeChangedAction.clear&&args.changedCells.length == 1) {//清除操作
  119. if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {//清除操作
  120. if (dataCode == 'feeRate') {
  121. $.bootstrapLoading.start();
  122. projectObj.project.FeeRate.updateFeeRateFromCalc(null, editInfo);
  123. }
  124. else if (dataCode == 'displayFieldName'){
  125. $.bootstrapLoading.start();
  126. for (let cell of args.changedCells){
  127. let curCalcItem = editInfo.template.calcItems[cell.row];
  128. curCalcItem.fieldName = '';
  129. curCalcItem.displayFieldName = '';
  130. };
  131. let data = {
  132. 'projectID': projectObj.project.ID(),
  133. 'ID': editInfo.template.ID,
  134. 'calcItems': editInfo.template.calcItems
  135. };
  136. gatherFeesView.updateTemplate(data, function (rst) {
  137. if (rst){
  138. gatherFeesView.refreshDetailSheet();
  139. $.bootstrapLoading.end();
  140. }
  141. });
  142. }
  143. }
  144. },
  145. onDetailValueChanged: function(sender, args) {
  146. $.bootstrapLoading.start();
  147. let me = gatherFeesView;
  148. let editInfo= me.getSelectionInfo();
  149. let curCalcItem = editInfo.calcItem;
  150. let dataCode = me.detailSetting.header[args.col].dataCode;
  151. if (dataCode == 'feeRate') {
  152. projectObj.project.FeeRate.updateFeeRateFromCalc(args.newValue, editInfo);
  153. $.bootstrapLoading.end();
  154. return;
  155. }
  156. let template = me.getSelectionInfo().template;
  157. if (dataCode == 'displayFieldName') {
  158. if (curCalcItem.displayFieldName == args.newValue) {
  159. $.bootstrapLoading.end();
  160. return;
  161. }
  162. if (analyzer.fieldNameIsUsed(template, args.newValue)){
  163. let sheet = me.detailSpread.getActiveSheet();
  164. sheet.suspendEvent();
  165. sheet.setValue(args.row, args.col, args.oldValue);
  166. sheet.resumeEvent();
  167. $.bootstrapLoading.end();
  168. let s = hintBox.font(template.fieldNameTempUsed + 1);
  169. hintBox.infoBox('系统提示', `“${args.newValue}” 已被第 ${s} 行使用,不允许重复选择!`, 1);
  170. delete template.fieldNameTempUsed;
  171. return;
  172. }
  173. curCalcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.newValue];
  174. }
  175. else if (dataCode == 'dispExprUser'){ // 除非直接改单元格,弹窗不会走这里
  176. hintBox.infoBox('系统提示', '用户直接在sheet中修改了dispExprUser值,触发onDetailEditEnded事件。', 1);
  177. };
  178. curCalcItem[dataCode] = args.newValue;
  179. if (dataCode == 'name'){
  180. analyzer.refreshUsedCalcItemsStatement(template, curCalcItem);
  181. let data = {
  182. 'projectID': projectObj.project.ID(),
  183. 'ID': template.ID,
  184. 'calcItems': template.calcItems
  185. };
  186. gatherFeesView.updateTemplate(data, function (rst) {
  187. if (rst){
  188. gatherFeesView.refreshDetailSheet();
  189. $.bootstrapLoading.end();
  190. }
  191. });
  192. if (activeSubSheetIsCalcProgram())
  193. calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 1);
  194. }
  195. else{
  196. let data = {
  197. 'projectID': projectObj.project.ID(),
  198. 'templatesID': template.ID,
  199. 'calcItem': curCalcItem
  200. };
  201. me.saveCalcItem(data, function (rst) {
  202. if (rst){
  203. let relationNodes = calcTools.getNodesByProgramID(template.ID);
  204. projectObj.project.calcProgram.calcNodesAndSave(relationNodes);
  205. $.bootstrapLoading.end();
  206. }
  207. });
  208. }
  209. },
  210. onDetailEnterCell: function (sender, args) {
  211. // if (args.col == 2) // 加这句,切换单元格后,原单元格的三点图片不会消失。
  212. gatherFeesView.detailSheet.repaint(); // 这句是为了触发sheetCommonObj → getCusButtonCellType → CusButtonCellType → paint方法。
  213. // for test.
  214. // let t = gatherFeesView.getSelectionInfo().template;
  215. // let c = gatherFeesView.getSelectionInfo().calcItem;
  216. // let lc = analyzer.calcItemLabourCoe(c);
  217. // c.dispExpr = analyzer.getDispExpr(c.expression, t);
  218. // c.dispExprUser = analyzer.getDispExprUser(c.dispExpr, lc);
  219. // c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc);
  220. // let e = `ID:${c.ID} ${c.expression} ${c.dispExpr} ${c.dispExprUser} ${c.compiledExpr} ${c.custom}`;
  221. // projectObj.testDisplay('', e);
  222. },
  223. getSelectionInfo:function () {
  224. var templateIndex = this.mainSpread.getActiveSheet().getActiveRowIndex();
  225. var dIndex = this.detailSpread.getActiveSheet().getActiveRowIndex();
  226. var info = {
  227. template:this.datas[templateIndex],
  228. calcItem:this.datas[templateIndex].calcItems[dIndex]
  229. }
  230. return info;
  231. },
  232. refreshDetailSheet:function () {
  233. var me = this;
  234. if(me.mainSpread && me.detailSpread){
  235. let mainRowIdx = me.mainSpread.getActiveSheet().getActiveRowIndex();
  236. let calcItems = me.datas[mainRowIdx].calcItems;
  237. let detailSheet = me.detailSpread.getActiveSheet();
  238. detailSheet.setRowCount(calcItems.length);
  239. sheetCommonObj.showData(detailSheet, me.detailSetting, calcItems);
  240. me.getfeeRateColor(calcItems);
  241. customRowHeader(detailSheet, calcItems.length);
  242. }
  243. },
  244. getfeeRateColor: function (calcItems) { // 有费率ID关联的变个色
  245. var me = this;
  246. for (let i = 0; i < calcItems.length; i++) {
  247. if (calcItems[i].feeRateID != undefined && calcItems[i].feeRateID != null)
  248. me.detailSheet.getCell(i, 3).foreColor("#0aa8ea")
  249. else
  250. me.detailSheet.getCell(i, 3).foreColor("black");
  251. }
  252. }
  253. };
  254. $(document).ready(function(){
  255. $('#tab_gather_fees').on('shown.bs.tab', function (e) {
  256. sessionStorage.setItem('mainTab', '#tab_gather_fees');
  257. $(e.relatedTarget.hash).removeClass('active');
  258. // 每次进来都要重新计算一次
  259. if (!gatherFeesView.mainSpread) {
  260. gatherFeesView.buildSheet();
  261. }
  262. gatherFeesView.mainSpread.refresh();
  263. gatherFeesView.showData();
  264. });
  265. // $("#lblGatherFee").bind('click',function () {
  266. // gatherFeesView.buildSheet();
  267. // gatherFeesView.refreshDetailSheet();
  268. // });
  269. });