formulasDataSetter.ts 9.5 KB

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