gather_fees_view.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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:160,dataCode:"name", dataType: "String"},
  11. {headerName:"金额",headerWidth:100,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. let count = 0;
  97. if (me.datas.length > 0){
  98. sheetCommonObj.showData(me.detailSheet, me.detailSetting, me.datas[0].calcItems);
  99. me.getfeeRateColor(me.datas[0].calcItems);
  100. customRowHeader(me.detailSheet, me.datas[0].calcItems.length);
  101. count = me.datas[me.mainSheet.getActiveRowIndex()].calcItems.length;
  102. }
  103. me.detailSheet.setRowCount(count, GC.Spread.Sheets.SheetArea.viewport);
  104. $.bootstrapLoading.end();
  105. },
  106. onMainEnterCell: function(sender, args) {
  107. var me = gatherFeesView;
  108. var row = args.sheet.getActiveRowIndex();
  109. me.detailSpread.suspendPaint();
  110. var dData = me.datas[row].calcItems;
  111. me.detailSheet.setRowCount(dData.length, GC.Spread.Sheets.SheetArea.viewport);
  112. sheetCommonObj.showData(me.detailSheet, me.detailSetting, dData);
  113. me.getfeeRateColor(dData);
  114. customRowHeader(me.detailSheet, dData.length);
  115. me.detailSpread.resumePaint();
  116. },
  117. onRangeChanged:function (sender,args) {
  118. let me = gatherFeesView;
  119. let editInfo= me.getSelectionInfo();
  120. let dataCode = me.detailSetting.header[args.col].dataCode;
  121. // if (args.action == GC.Spread.Sheets.RangeChangedAction.clear&&args.changedCells.length == 1) {//清除操作
  122. if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {//清除操作
  123. if (dataCode == 'feeRate') {
  124. $.bootstrapLoading.start();
  125. projectObj.project.FeeRate.updateFeeRateFromCalc(null, editInfo);
  126. }
  127. else if (dataCode == 'displayFieldName'){
  128. $.bootstrapLoading.start();
  129. for (let cell of args.changedCells){
  130. let curCalcItem = editInfo.template.calcItems[cell.row];
  131. curCalcItem.fieldName = '';
  132. curCalcItem.displayFieldName = '';
  133. };
  134. let data = {
  135. 'projectID': projectObj.project.ID(),
  136. 'ID': editInfo.template.ID,
  137. 'calcItems': editInfo.template.calcItems
  138. };
  139. gatherFeesView.updateTemplate(data, function (rst) {
  140. if (rst){
  141. gatherFeesView.refreshDetailSheet();
  142. $.bootstrapLoading.end();
  143. }
  144. });
  145. }
  146. }
  147. },
  148. onDetailValueChanged: function(sender, args) {
  149. $.bootstrapLoading.start();
  150. let me = gatherFeesView;
  151. let editInfo= me.getSelectionInfo();
  152. let curCalcItem = editInfo.calcItem;
  153. let dataCode = me.detailSetting.header[args.col].dataCode;
  154. if (dataCode == 'feeRate') {
  155. projectObj.project.FeeRate.updateFeeRateFromCalc(args.newValue, editInfo);
  156. $.bootstrapLoading.end();
  157. return;
  158. }
  159. let template = me.getSelectionInfo().template;
  160. if (dataCode == 'displayFieldName') {
  161. if (curCalcItem.displayFieldName == args.newValue) {
  162. $.bootstrapLoading.end();
  163. return;
  164. }
  165. if (analyzer.fieldNameIsUsed(template, args.newValue)){
  166. let sheet = me.detailSpread.getActiveSheet();
  167. sheet.suspendEvent();
  168. sheet.setValue(args.row, args.col, args.oldValue);
  169. sheet.resumeEvent();
  170. $.bootstrapLoading.end();
  171. let s = hintBox.font(template.fieldNameTempUsed + 1);
  172. hintBox.infoBox('系统提示', `“${args.newValue}” 已被第 ${s} 行使用,不允许重复选择!`, 1);
  173. delete template.fieldNameTempUsed;
  174. return;
  175. }
  176. curCalcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.newValue];
  177. }
  178. else if (dataCode == 'dispExprUser'){ // 除非直接改单元格,弹窗不会走这里
  179. hintBox.infoBox('系统提示', '用户直接在sheet中修改了dispExprUser值,触发onDetailEditEnded事件。', 1);
  180. };
  181. curCalcItem[dataCode] = args.newValue;
  182. if (dataCode == 'name'){
  183. analyzer.refreshUsedCalcItemsStatement(template, curCalcItem);
  184. let data = {
  185. 'projectID': projectObj.project.ID(),
  186. 'ID': template.ID,
  187. 'calcItems': template.calcItems
  188. };
  189. gatherFeesView.updateTemplate(data, function (rst) {
  190. if (rst){
  191. gatherFeesView.refreshDetailSheet();
  192. $.bootstrapLoading.end();
  193. }
  194. });
  195. if (activeSubSheetIsCalcProgram())
  196. calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 1);
  197. }
  198. else{
  199. let data = {
  200. 'projectID': projectObj.project.ID(),
  201. 'templatesID': template.ID,
  202. 'calcItem': curCalcItem
  203. };
  204. me.saveCalcItem(data, function (rst) {
  205. if (rst){
  206. let relationNodes = calcTools.getNodesByProgramID(template.ID);
  207. projectObj.project.calcProgram.calcNodesAndSave(relationNodes);
  208. $.bootstrapLoading.end();
  209. }
  210. });
  211. }
  212. },
  213. onDetailEnterCell: function (sender, args) {
  214. // if (args.col == 2) // 加这句,切换单元格后,原单元格的三点图片不会消失。
  215. gatherFeesView.detailSheet.repaint(); // 这句是为了触发sheetCommonObj → getCusButtonCellType → CusButtonCellType → paint方法。
  216. // for test.
  217. // let t = gatherFeesView.getSelectionInfo().template;
  218. // let c = gatherFeesView.getSelectionInfo().calcItem;
  219. // let lc = analyzer.calcItemLabourCoe(c);
  220. // c.dispExpr = analyzer.getDispExpr(c.expression, t);
  221. // c.dispExprUser = analyzer.getDispExprUser(c.dispExpr, lc);
  222. // c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc);
  223. // let e = `ID:${c.ID} ${c.expression} ${c.dispExpr} ${c.dispExprUser} ${c.compiledExpr} ${c.custom}`;
  224. // projectObj.testDisplay('', e);
  225. },
  226. getSelectionInfo:function () {
  227. var templateIndex = this.mainSpread.getActiveSheet().getActiveRowIndex();
  228. var dIndex = this.detailSpread.getActiveSheet().getActiveRowIndex();
  229. var info = {
  230. template:this.datas[templateIndex],
  231. calcItem:this.datas[templateIndex].calcItems[dIndex]
  232. }
  233. return info;
  234. },
  235. refreshDetailSheet:function () {
  236. var me = this;
  237. if(me.mainSpread && me.detailSpread){
  238. let mainRowIdx = me.mainSpread.getActiveSheet().getActiveRowIndex();
  239. let calcItems = me.datas[mainRowIdx].calcItems;
  240. let detailSheet = me.detailSpread.getActiveSheet();
  241. detailSheet.setRowCount(calcItems.length);
  242. sheetCommonObj.showData(detailSheet, me.detailSetting, calcItems);
  243. me.getfeeRateColor(calcItems);
  244. customRowHeader(detailSheet, calcItems.length);
  245. }
  246. },
  247. getfeeRateColor: function (calcItems) { // 有费率ID关联的变个色
  248. var me = this;
  249. for (let i = 0; i < calcItems.length; i++) {
  250. if (calcItems[i].feeRateID != undefined && calcItems[i].feeRateID != null)
  251. me.detailSheet.getCell(i, 3).foreColor("#0aa8ea")
  252. else
  253. me.detailSheet.getCell(i, 3).foreColor("black");
  254. }
  255. }
  256. };
  257. $(document).ready(function(){
  258. $('#tab_gather_fees').on('shown.bs.tab', function (e) {
  259. sessionStorage.setItem('mainTab', '#tab_gather_fees');
  260. $(e.relatedTarget.hash).removeClass('active');
  261. // 每次进来都要重新计算一次
  262. if (!gatherFeesView.mainSpread) {
  263. gatherFeesView.buildSheet();
  264. }
  265. gatherFeesView.mainSpread.refresh();
  266. gatherFeesView.showData();
  267. });
  268. // $("#lblGatherFee").bind('click',function () {
  269. // gatherFeesView.buildSheet();
  270. // gatherFeesView.refreshDetailSheet();
  271. // });
  272. });