formulasDataSetter.ts 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //计算式执行的具体方法
  2. import { Fields, ICurrent_RPT, IDataObj, IGroupField, IParam } from "../index";
  3. import { IParams } from "../interface/basic";
  4. import { IDataObjProps } from '../interface/enum';
  5. import { ReportDate } from '../public/ReportDate'
  6. let FData: Record<string, IGroupField> = {};
  7. let PData: Record<string, IParam> = {};
  8. let DData: Record<string, any> = {};
  9. let rpt = <ICurrent_RPT>{};
  10. let orgData = <IDataObj>{};
  11. const setupData = ($CURRENT_RPT: ICurrent_RPT, $CURRENT_DATA: IDataObj) => {
  12. rpt = $CURRENT_RPT;
  13. orgData = $CURRENT_DATA;
  14. }
  15. const resetData = () => {
  16. DData = {};
  17. FData = {};
  18. PData = {};
  19. }
  20. const getFieldValueArray = (field: IGroupField) => {
  21. let rst: any;
  22. if (field.DataNodeName === IDataObjProps.NA) {
  23. if (!field.data_field) {
  24. field.data_field = [];
  25. }
  26. rst = field.data_field;
  27. } else {
  28. if (!field.DataNodeName) {
  29. console.log('进来了特殊情况')
  30. // that means this is a self-defined discrete field!
  31. field.DataNodeName = IDataObjProps.discrete_data;
  32. // field.DataSeq = dataObj[IDataObjProps.discrete_data];
  33. orgData[IDataObjProps.discrete_data].push([]);
  34. }
  35. rst = orgData[field.DataNodeName][field.DataSeq];
  36. }
  37. if (rst === null || rst === undefined) rst = [];
  38. return rst;
  39. }
  40. //获取一般指标的指标对象($CURRENT_RPT.fields中的对象)
  41. const F = (fieldID: number) => {
  42. if (FData[fieldID]) {
  43. return FData[fieldID];
  44. } else {
  45. for (const dataSet in rpt.fields) {
  46. for (const field in rpt.fields[dataSet]) {
  47. const newFieldID = field.replace('ID_', '');
  48. if (newFieldID === `${fieldID}`) {
  49. FData[fieldID] = rpt.fields[dataSet][field];
  50. DData[fieldID] = getFieldValueArray(rpt.fields[dataSet][field]);
  51. return FData[fieldID];
  52. }
  53. }
  54. }
  55. }
  56. return false;
  57. }
  58. // 获取离散指标的指标对象($CURRENT_RPT.params中的对象,一般是打印页,总页数,当前页数)
  59. const P = (fieldID: number) => {
  60. if (PData[fieldID]) {
  61. return PData[fieldID];
  62. } else {
  63. for (const field in rpt.params) {
  64. const fieldID = field.replace('ID_', '');
  65. if (fieldID === fieldID) {
  66. PData[fieldID] = rpt.params[field]
  67. DData[fieldID] = rpt.params[field].Default_Value;
  68. return rpt.params[field];
  69. }
  70. }
  71. }
  72. return false;
  73. }
  74. // 获取数据,只有一个参数时获取该指标所有数据(数组),两个参数时获取该指标中的第N个数据(值)
  75. const D = (fieldID: number, valIndex?: number, newValue?: any) => {
  76. if (valIndex || valIndex === 0) {
  77. if (DData[fieldID]) {
  78. return DData[fieldID][valIndex];
  79. } else {
  80. if (!F(fieldID)) P(fieldID);
  81. if (DData[fieldID]) {
  82. if (DData[fieldID].length >= valIndex) {
  83. if (!DData[fieldID][valIndex]&&DData[fieldID][valIndex]!==0) return '';
  84. return DData[fieldID][valIndex];
  85. } else {
  86. console.log(`指标id:${fieldID},${valIndex}>${DData[fieldID].length},请检查`)
  87. return '';
  88. }
  89. } else {
  90. console.log(`无ID为${fieldID}的指标,请检查`)
  91. return '';
  92. }
  93. }
  94. } else {
  95. if (DData[fieldID]) {
  96. return DData[fieldID];
  97. } else {
  98. if (!F(fieldID)) P(fieldID);
  99. if (DData[fieldID]) {
  100. return DData[fieldID];
  101. } else {
  102. console.log(`无ID为${fieldID}的指标,请检查`)
  103. return []
  104. }
  105. }
  106. }
  107. }
  108. //获取相应指标的数据长度
  109. const L = (arg: any) => {
  110. if (arg in IDataObjProps) {
  111. return orgData[arg][0].length;
  112. } else {
  113. if (DData[arg]) {
  114. return DData[arg].length;
  115. } else {
  116. F(arg);
  117. if (DData[arg]) {
  118. return DData[arg];
  119. } else {
  120. console.log(`无ID为${arg}的指标,请检查`)
  121. return 0
  122. }
  123. }
  124. }
  125. }
  126. //获取当前页
  127. const getCurrentPage = () => {
  128. let rst = 0;
  129. if (rpt && rpt.runTimePageData.currentPage) {
  130. rst = rpt.runTimePageData.currentPage;
  131. }
  132. return rst;
  133. }
  134. // 获取总页数
  135. const getTotalPage = () => {
  136. let rst = 0;
  137. if (rpt) {
  138. rst = rpt.totalPages;
  139. }
  140. return rst;
  141. }
  142. //向目标对象赋值
  143. const setFieldValue = (field: IGroupField, valIdx: number, newValue: any) => {
  144. if (field.DataNodeName === "NA") {
  145. if (!field.data_field) {
  146. field.data_field = [];
  147. }
  148. field.data_field[valIdx] = newValue;
  149. } else if (!field.DataNodeName) {
  150. //that means this is a self-defined discrete field!
  151. field.DataNodeName = IDataObjProps.discrete_data;
  152. field.DataSeq = orgData[IDataObjProps.discrete_data].length;
  153. orgData[IDataObjProps.discrete_data].push([]);
  154. orgData[field.DataNodeName][field.DataSeq][valIdx] = newValue;
  155. } else {
  156. orgData[field.DataNodeName][field.DataSeq][valIdx] = newValue;
  157. }
  158. }
  159. //反向设置原始数据
  160. const setFieldValueArray = (field: IGroupField, newArr: any[]) => {
  161. if (newArr instanceof Array) {
  162. if (field.DataNodeName === 'NA') {
  163. field.data_field = newArr;
  164. } else {
  165. if (!field.DataNodeName) {
  166. // that means this is a self-defined discrete field!
  167. field.DataNodeName = IDataObjProps.discrete_data;
  168. field.DataSeq = orgData[IDataObjProps.discrete_data].length;
  169. orgData[IDataObjProps.discrete_data].push([]);
  170. }
  171. orgData[field.DataNodeName][field.DataSeq] = newArr;
  172. }
  173. }
  174. }
  175. //反向设置原始数据
  176. const setFieldDefaultValue = (fieldID: number, newValue: any) => {
  177. rpt.params[`ID_${fieldID}`].Default_Value = newValue;
  178. }
  179. //该函数为共用方法,参数有两套组合:
  180. // (指标id,更改后的数组)
  181. // (指标id,需要更改的index,.需要更改的值)
  182. const setData = (fieldID: number, arg1: number[] | string[] | number | string, arg2?: number | string) => {
  183. const field = F(fieldID)
  184. if (field) {
  185. if (arg1 instanceof Array) {
  186. if (DData[fieldID]) {
  187. DData[fieldID] = arg1;
  188. setFieldValueArray(field, arg1);
  189. } else {
  190. console.log(`无ID为${fieldID}的指标,请检查`)
  191. }
  192. } else {
  193. if (typeof (arg1) === 'number') {
  194. if (DData[fieldID]) {
  195. if (arg1 <= DData[fieldID].length) {
  196. DData[fieldID][arg1] = arg2;
  197. setFieldValue(field, arg1, arg2);
  198. } else {
  199. console.log(`指标id:${fieldID},数据长度为${DData[fieldID].length},第二参数为${arg1},请检查`)
  200. }
  201. } else {
  202. console.log(`无ID为${fieldID}的指标,请检查`)
  203. }
  204. }
  205. }
  206. } else if (P(fieldID)) {
  207. setFieldDefaultValue(fieldID, arg1);
  208. DData[fieldID] = arg1;
  209. }
  210. }
  211. //把数组每个元素都转换成数字
  212. const getNumberArray = (data: string[] | undefined[] | [] | number[]) => {
  213. const rst: number[] = [];
  214. for (const item of data) {
  215. if (isNaN(Number(item))) {
  216. rst.push(0);
  217. } else {
  218. rst.push(Number(item));
  219. }
  220. }
  221. return rst;
  222. }
  223. const removeFieldValue = (fieldID: number, valIdx: number) => {
  224. const fField: (IGroupField) = <IGroupField>F(fieldID);
  225. if (fField) {
  226. DData[fieldID].splice(valIdx, 1);
  227. } else {
  228. console.log(`指标${fieldID}的数据不支持removeFieldValue操作`);
  229. }
  230. }
  231. const insertFieldValue = (fieldID: number, valIdx: number, newValue: number) => {
  232. let field = <IGroupField>F(fieldID);
  233. if (field) {
  234. DData[fieldID].splice(valIdx, 0, newValue);
  235. } else {
  236. console.log(`指标${fieldID}的数据不支持insertFieldValue操作`);
  237. }
  238. }
  239. //复制精度
  240. const copyPrecision = (targetFieldID: number, orgFieldID: number) => {
  241. copyProperty(targetFieldID, orgFieldID, 'Precision');
  242. }
  243. const copyFixedPrecisionNum = (targetFieldID: number, orgFieldID: number) => {
  244. copyProperty(targetFieldID, orgFieldID, 'fixedPrecisionNum');
  245. }
  246. //复制属性
  247. const copyProperty = (targetFieldID: number, orgFieldID: number, property: string) => {
  248. const targetField = <IGroupField>F(targetFieldID);
  249. const orgField = <IGroupField>F(orgFieldID);
  250. if (targetField && orgField) {
  251. if (orgField[property]) {
  252. if (!targetField[property]) {
  253. targetField[property] = {};
  254. }
  255. Object.assign(targetField[property], orgField[property]);
  256. } else {
  257. console.log(`指标${orgFieldID}不存在${property}属性`);
  258. }
  259. } else {
  260. console.log(`指标${targetFieldID}和${orgFieldID}的数据不支持copyProperty操作`);
  261. }
  262. }
  263. const setDate = (fieldID: number, format: string) => {
  264. const date = new ReportDate();
  265. setData(fieldID, date.Format(format));
  266. }
  267. const DLength = () => {
  268. if (orgData && orgData.detail_data) return orgData.detail_data[0].length
  269. return 0;
  270. }
  271. export default {
  272. setupData,
  273. P,
  274. F,
  275. D,
  276. getCurrentPage,
  277. getTotalPage,
  278. L,
  279. setFieldValue,
  280. setFieldValueArray,
  281. removeFieldValue,
  282. insertFieldValue,
  283. setData,
  284. resetData,
  285. getNumberArray,
  286. copyPrecision,
  287. copyFixedPrecisionNum,
  288. copyProperty,
  289. setDate,
  290. DLength
  291. }