field.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. import u from "/@/utils/u";
  2. /**
  3. * 字段信息处理工具类
  4. */
  5. const fieldUtil = {
  6. fieldList: [
  7. {name: '单行文本', type: 'text', icon: 'ele-Aim', cluster: '基础组件'},
  8. {name: '多行文本', type: 'textarea', icon: 'ele-Aim', cluster: '基础组件'},
  9. {name: '数字框', type: 'number', icon: 'ele-Aim', cluster: '基础组件'},
  10. {name: '下拉框', type: 'dict', icon: 'ele-Aim', cluster: '基础组件'},
  11. {name: '搜索下拉框', type: 'select', icon: 'ele-Aim', cluster: '基础组件'},
  12. {name: '单选框', type: 'radio', icon: 'ele-Aim', cluster: '基础组件'},
  13. {name: '复选框', type: 'checkbox', icon: 'ele-Aim', cluster: '基础组件'},
  14. {name: '富文本', type: 'rich', icon: 'ele-Aim', cluster: '基础组件', conf: {mode: 'simple'}},
  15. {name: '图片', type: 'image', icon: 'ele-Aim', cluster: '基础组件'},
  16. {name: '附件', type: 'attach', icon: 'ele-Aim', cluster: '基础组件'},
  17. {name: '日历', type: 'calendar', icon: 'ele-Aim', cluster: '基础组件'},
  18. {name: '日期', type: 'datetime', icon: 'ele-Aim', cluster: '基础组件'},
  19. {name: '日期区间', type: 'daterange', icon: 'ele-Aim', cluster: '基础组件'},
  20. {name: '评分', type: 'rate', icon: 'ele-Aim', cluster: '基础组件'},
  21. {name: '进度', type: 'progress', icon: 'ele-Aim', cluster: '基础组件'},
  22. {name: '颜色', type: 'color', icon: 'ele-Aim', cluster: '基础组件'},
  23. {name: '开关', type: 'switch', icon: 'ele-Aim', cluster: '基础组件'},
  24. {name: '滑块', type: 'silde', icon: 'ele-Aim', cluster: '基础组件'},
  25. {name: '部门', type: 'dept', icon: 'ele-Aim', cluster: '高级组件'},
  26. {name: '成员', type: 'user', icon: 'ele-Aim', cluster: '高级组件'},
  27. {name: '搜索', type: 'search', icon: 'ele-Aim', cluster: '高级组件'},
  28. {name: '级联框', type: 'cascade', icon: 'ele-Aim', cluster: '高级组件'},
  29. {name: '表格', type: 'table', icon: 'ele-Aim', cluster: '高级组件'},
  30. {name: '定时器', type: 'cron', icon: 'ele-Aim', cluster: '高级组件'},
  31. {name: '关联字段', type: 'assofield', icon: 'ele-Aim', cluster: '高级组件'},
  32. {name: '关联列表', type: 'assolist', icon: 'ele-Aim', cluster: '高级组件'},
  33. {name: '应用成员', type: 'appletuser', icon: 'ele-Aim', cluster: '高级组件'},
  34. {name: '应用角色', type: 'appletrole', icon: 'ele-Aim', cluster: '高级组件'},
  35. {name: '分栏', type: 'divider', icon: 'ele-Aim', cluster: '其他组件'},
  36. {name: '提示语', type: 'tip', icon: 'ele-Aim', cluster: '其他组件'},
  37. {name: '标题栏', type: 'title', icon: 'ele-Aim', cluster: '其他组件'},
  38. {name: '渲染器', type: 'render', icon: 'ele-Aim', cluster: '其他组件'},
  39. {name: '当前时间', type: 'curdate', icon: 'ele-Aim', cluster: '静态组件'},
  40. {name: '当前部门', type: 'curdept', icon: 'ele-Aim', cluster: '静态组件'},
  41. {name: '当前用户', type: 'curuser', icon: 'ele-Aim', cluster: '静态组件'},
  42. ],
  43. toFormQueryField(fields: Array<IField>): Array<any> {
  44. let ret = [] as Array<any>;
  45. if (u.isEmptyOrNull(fields)) {
  46. return ret;
  47. }
  48. for (let i = 0; i < fields.length; i++) {
  49. let f = fields[i];
  50. if (!f.query) {
  51. continue;
  52. }
  53. //不支持查询的字段类型
  54. if (!f.type || ["rich", "image", "attach", "calendar", "table", "map", "color", "search", "title", "split", "button", "tip", 'divider'].includes(f.type)) {
  55. continue;
  56. }
  57. //查询框分类 文本、数字、下拉、部门、用户、搜索框
  58. let fconfig = {
  59. ...f,
  60. xs: 6,
  61. sm: 4,
  62. md: 4,
  63. lg: 2,
  64. xl: 2,
  65. rules: [],
  66. placeholder: f.label,
  67. readonly: false
  68. }
  69. if (fconfig.conf) {
  70. fconfig.conf.clearable = true;
  71. }
  72. //queryType高优先级覆盖
  73. if (f.queryType) {
  74. f.type = f.queryType;
  75. }
  76. //文本类
  77. if (['text', 'textarea'].includes(f.type)) {
  78. fconfig.type = 'text';
  79. } else if (['number', 'rate', 'progress', 'slide'].includes(f.type)) {
  80. fconfig.type = 'number';
  81. }
  82. if (['date', 'time', 'number', 'datetime', 'rate', 'progress', 'slide'].includes(f.type)) {
  83. if (f.conf && f.conf.op) {
  84. let operation = this.convertOperate(f.conf.op);
  85. if (operation) {
  86. ret.push({
  87. ...fconfig,
  88. prop: `${f.prop}${operation.key}`,
  89. label: `${f.label}${operation.remark}`,
  90. placeholder: `${f.label}${operation.remark}`
  91. });
  92. } else {
  93. //console.error("不能识别的操作符:", f.conf.op)
  94. }
  95. } else {
  96. ret.push({
  97. ...fconfig,
  98. prop: `${f.prop}Start`,
  99. label: `${f.label}大于`,
  100. placeholder: `${f.label}大于`
  101. });
  102. ret.push({
  103. ...fconfig,
  104. prop: `${f.prop}End`,
  105. label: `${f.label}小于`,
  106. placeholder: `${f.label}小于`
  107. });
  108. }
  109. } else {
  110. ret.push(fconfig);
  111. }
  112. }
  113. //console.log("toFormQueryField>>>>", JSON.stringify(ret))
  114. return ret;
  115. },
  116. toFormCreateField(fields: Array<IField>): Array<any> {
  117. let ret = [] as Array<any>;
  118. if (u.isEmptyOrNull(fields)) {
  119. return ret;
  120. }
  121. //console.log("toFormCreateField>>>>", JSON.stringify(fields))
  122. for (let i = 0; i < fields.length; i++) {
  123. let f = fields[i];
  124. //表单 分类 文本、数字、下拉、部门、用户、搜索框
  125. let fconfig = {
  126. xs: 12,
  127. sm: 12,
  128. md: 12,
  129. lg: 4,
  130. xl: 4,
  131. rules: [],
  132. ...f,
  133. placeholder: f.placeholder || ('请设置' + f.label),
  134. disabled: !!f.readonly
  135. }
  136. if (fconfig.conf) {
  137. fconfig.conf.clearable = true;
  138. }
  139. if (['textarea', 'divider'].includes(f.type)) {
  140. fconfig = {...fconfig, xs: 24, sm: 24, md: 24, lg: 24, xl: 24}
  141. }
  142. if (['dept', 'user', 'search'].includes(f.type)) {
  143. fconfig["displayList"] = f.prop.replaceAll("IdList", "List")
  144. .replaceAll("Id", "Name");
  145. }
  146. ret.push(fconfig);
  147. }
  148. //console.log("toFormCreateField>>>>", JSON.stringify(ret))
  149. return ret;
  150. },
  151. toTableShowField(fields: Array<IField>): Array<IField> {
  152. let ret = [] as Array<IField>;
  153. if (u.isEmptyOrNull(fields)) {
  154. return ret;
  155. }
  156. for (let i = 0; i < fields.length; i++) {
  157. let f = {...fields[i]};
  158. //不支持查询的字段类型
  159. if (!f.type || ["calendar", "table", "map", "color", "search", "title", "split", "button", "tip"].includes(f.type)) {
  160. continue;
  161. }
  162. if (f.hide) {
  163. continue
  164. }
  165. if (!f.width && f.autoWidth) {
  166. f.width = f.label.length * 25 + 20;
  167. }
  168. //date字段宽度
  169. if (this.isDateField(f) && !f.width) {
  170. f.width = 150;
  171. }
  172. ret.push(f);
  173. }
  174. //console.log("toTableShowField>>>>", JSON.stringify(ret))
  175. return ret;
  176. },
  177. toWorkflowField(fields: Array<IField>): Array<IField> {
  178. let ret = [] as Array<IField>;
  179. return ret;
  180. },
  181. toTaskWriteField(fields: Array<any>): Array<IField> {
  182. let ret = [] as Array<any>;
  183. if (u.isEmptyOrNull(fields)) {
  184. return ret;
  185. }
  186. //console.log("toTaskWriteField>>>>", JSON.stringify(fields))
  187. for (let i = 0; i < fields.length; i++) {
  188. let f = fields[i];
  189. let conf = f.conf||{};
  190. let ww = conf.ww || 3; //6等分
  191. let widthStyle = {
  192. xs: ww * 4,
  193. sm: ww * 4,
  194. md: ww * 4,
  195. lg: ww * 2,
  196. xl: ww * 2
  197. }
  198. //表单 分类 文本、数字、下拉、部门、用户、搜索框
  199. let fconfig = {
  200. ...widthStyle,
  201. rules: [],
  202. ...f,
  203. placeholder: f.remark || ('请设置' + f.name),
  204. }
  205. if (['textarea', 'divider','rich'].includes(f.type)) {
  206. fconfig = {...fconfig, xs: 24, sm: 24, md: 24, lg: 24, xl: 24}
  207. }
  208. if (['dept', 'user', 'search'].includes(f.type)) {
  209. fconfig["displayList"] = f.prop.replaceAll("IdList", "List")
  210. .replaceAll("Id", "Name");
  211. }
  212. ret.push(fconfig);
  213. }
  214. //console.log("toTaskWriteField>>>>", JSON.stringify(ret))
  215. return ret;
  216. },
  217. convertOperate(op: string) {
  218. let operations = [
  219. {
  220. symbols: ["eq", "="],
  221. key: '',
  222. remark: '等于'
  223. },
  224. {
  225. symbols: ["neq", "!=", "<>"],
  226. key: 'Not',
  227. remark: '不等于'
  228. },
  229. {
  230. symbols: ["gt", ">"],
  231. key: 'Start',
  232. remark: '大于'
  233. },
  234. {
  235. symbols: ["gte", ">="],
  236. key: 'StartC',
  237. remark: '不小于'
  238. },
  239. {
  240. symbols: ["lt", "<"],
  241. key: 'End',
  242. remark: '小于'
  243. },
  244. {
  245. symbols: ["lte", "<="],
  246. key: 'EndC',
  247. remark: '不大于'
  248. },
  249. {
  250. symbols: ["in"],
  251. key: 'In',
  252. remark: '包含'
  253. },
  254. {
  255. symbols: ["nin"],
  256. key: 'Nin',
  257. remark: '不包含'
  258. },
  259. ]
  260. let sym = operations.find(k => k.symbols.includes(op));
  261. if (sym) {
  262. return sym;
  263. }
  264. return null;
  265. },
  266. isNormalField(field: IField) {
  267. return ['text', 'textarea'].includes(field.type)
  268. },
  269. isDateField(field: IField) {
  270. return ['date', 'time', 'datetime'].includes(field.type)
  271. },
  272. isDeptUserField(field: IField) {
  273. return ['dept', 'user'].includes(field.type)
  274. },
  275. value(field: IField, row: any) {
  276. let ret: any = row[field.prop];
  277. if (this.isNormalField(field)) {
  278. ret = row[field.prop];
  279. } else if (this.isDateField(field)) {
  280. if (field.conf && field.conf.format) {
  281. return field.conf.format(row[field.prop]);
  282. }
  283. } else if (this.isDeptUserField(field)) {
  284. let multiple = !!(field.conf?.multiple);
  285. let prop = field.prop;
  286. if (multiple) {
  287. //ownerIdList==> ownerList col_100==>col_100val
  288. if (prop.endsWith("IdList")) {
  289. let key = prop.substring(0, prop.indexOf("IdList")) + "List"
  290. if (row[key]) {
  291. //判断是否数组
  292. if (Array.isArray(row[key])) {
  293. ret = row[key].map((k: any) => k.name || k.title);
  294. }
  295. }
  296. } else if (prop.startsWith("col_")) {
  297. let key = prop + "val";
  298. if (row.formData[key]) {
  299. if (Array.isArray(row.formData[key])) {
  300. ret = row.formData[key].map((k: any) => k.name || k.title);
  301. }
  302. }
  303. }
  304. if (!ret) {
  305. return [];
  306. }
  307. return ret;
  308. } else {
  309. //createBy==>createName categroyId=>categoryName col_100 =>col_100val
  310. if (prop.endsWith("By")) {
  311. let key = prop.substring(0, prop.indexOf("By")) + "Name"
  312. if (row[key]) {
  313. ret = [row[key]]
  314. } else {
  315. if (row.formData[key]) {
  316. ret = row.formData[key];
  317. }
  318. }
  319. } else if (prop.endsWith("Id")) {
  320. let key = prop.substring(0, prop.indexOf("Id")) + "Name"
  321. if (row[key]) {
  322. ret = [row[key]]
  323. }
  324. } else if (prop.startsWith("col_")) {
  325. let key = prop + "val";
  326. if (row[key]) {
  327. ret = [row[key]]
  328. }
  329. }
  330. if (!ret) {
  331. return [];
  332. }
  333. return ret;
  334. }
  335. }
  336. if (!ret && field.conf && field.conf.deft) {
  337. ret = field.conf.deft;
  338. }
  339. return ret;
  340. },
  341. setFormSortQuery(order: any, formQuery: any) {
  342. //console.log(order, formQuery)
  343. //
  344. let key = order?.column?.columnKey || order?.prop;
  345. if (!key) {
  346. return;
  347. }
  348. formQuery.sortFields = formQuery.sortFields || [];
  349. let keyIndex = formQuery.sortFields.indexOf(key);
  350. let ord = order.order;
  351. if (ord === "descending") {
  352. formQuery[`${key}Sort`] = 2;
  353. if (keyIndex < 0) {
  354. // formQuery.sortFields.push(key);
  355. }
  356. } else if (ord === "ascending") {
  357. formQuery[`${key}Sort`] = 1;
  358. if (keyIndex < 0) {
  359. // formQuery.sortFields.push(key);
  360. }
  361. } else {
  362. formQuery[`${key}Sort`] = null;
  363. if (keyIndex >= 0) {
  364. // formQuery.sortFields.splice(keyIndex,1);
  365. }
  366. }
  367. //console.log(order, formQuery)
  368. }
  369. }
  370. export default fieldUtil;