Brak opisu

taskTemplate-data.tsx 34KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294
  1. import type { FormSchemaGetter } from '#/adapter/form';
  2. import type { VxeGridProps } from '#/adapter/vxe-table';
  3. // @ts-ignore
  4. import { ElButton, ElMessage } from 'element-plus';
  5. // import type { SelectProps } from '#/adapter/form';
  6. import { getPostList } from '#/api/system/post/post';
  7. import { querybaseApilist as queryCheckFormList } from '#/api/system/tasksettings/checktheform';
  8. import { querybaseApilist } from '#/api/system/tasksettings/tasktemplate';
  9. import { getUserList } from '#/api/system/user/user';
  10. import { getDictOptions } from '#/utils/dict';
  11. // 字典标识常量
  12. const DICT_KEYS = {
  13. // 任务类型字典标识
  14. TASK_TYPE: 'task_type',
  15. // 表单类型
  16. FORM_TYPE: 'wf_form_type',
  17. // 任务频率
  18. TASK_FREQUENCY: 'task_frequency',
  19. };
  20. // @ts-ignore:获取执行岗位列表
  21. export let positionsOptions = [] as any[];
  22. // @ts-ignore:任务负责人
  23. export let PersoninchargeOptions = [] as any[];
  24. const getPositionsList = async () => {
  25. const { rows } = await getPostList({});
  26. positionsOptions = rows.map((item: any) => ({
  27. label: item.postName,
  28. value: item.postId,
  29. type: item.type,
  30. }));
  31. };
  32. // postId 1 管理部
  33. // postId 2 片区经理
  34. // postId 3 站长
  35. // postId 4 当班经理
  36. // postId 5 测试
  37. // postId 6 安全管理部
  38. // 初始化岗位数据
  39. getPositionsList().catch(console.error);
  40. const deptTreefn = async () => {
  41. // @ts-ignore
  42. const res = await getUserList({});
  43. PersoninchargeOptions = res.rows.map((item: any) => ({
  44. label: item.userName,
  45. value: item.userId,
  46. }));
  47. };
  48. deptTreefn();
  49. // 获取任务类型字典选项
  50. const getTaskTypeOptions = () => getDictOptions(DICT_KEYS.TASK_TYPE);
  51. // 获取表单类型字典选项
  52. const getFormTypeOptions = () => getDictOptions(DICT_KEYS.FORM_TYPE);
  53. // console.log('表单类型',getFormTypeOptions());
  54. // console.log('过滤表单类型',getFormTypeOptions()?.filter((item: any) => item?.value !== 'form'));
  55. // 获取任务频率字典选项
  56. export const getTaskFrequencyOptions = () =>
  57. getDictOptions(DICT_KEYS.TASK_FREQUENCY);
  58. // console.log('任务频率', getTaskFrequencyOptions());
  59. // 通用Select组件配置函数
  60. const createSearchSelectConfig = (options: any[], placeholder: string) => ({
  61. allowClear: true,
  62. placeholder,
  63. showSearch: true,
  64. filterOption: (input: string, option: any) =>
  65. (option?.label || '').toLowerCase().includes(input.toLowerCase()),
  66. options,
  67. });
  68. // 通用RadioGroup组件配置函数
  69. const createRadioConfig = (
  70. options: { label: string; value: string }[],
  71. defaultValue?: string,
  72. ) => ({
  73. options,
  74. defaultValue,
  75. });
  76. export const queryFormSchema: FormSchemaGetter = () => [
  77. {
  78. component: 'Input',
  79. fieldName: 'taskName',
  80. label: '任务名称',
  81. componentProps: {
  82. placeholder: '请输入任务名称',
  83. clearable: true,
  84. },
  85. },
  86. {
  87. component: 'Select',
  88. fieldName: 'taskType',
  89. label: '任务类型',
  90. componentProps: {
  91. allowClear: true,
  92. placeholder: '请选择任务类型',
  93. options: getTaskTypeOptions(),
  94. clearable: true,
  95. },
  96. },
  97. {
  98. component: 'ApiSelect',
  99. fieldName: 'taskLeader',
  100. label: '任务负责人',
  101. componentProps: {
  102. placeholder: '请选择任务来源',
  103. api: async () => {
  104. const resp: any = await getUserList({
  105. pageNum: 1,
  106. pageSize: 100,
  107. });
  108. return resp.rows.map((item: any) => ({
  109. label: item.nickName || item.userName,
  110. value: item.userId.toString(),
  111. }));
  112. },
  113. filterable: true,
  114. labelField: 'label',
  115. valueField: 'value',
  116. },
  117. },
  118. {
  119. component: 'Select',
  120. fieldName: 'executePosition',
  121. label: '执行岗位',
  122. componentProps: {
  123. allowClear: true,
  124. placeholder: '请选择执行岗位',
  125. options: positionsOptions,
  126. clearable: true,
  127. },
  128. },
  129. {
  130. component: 'Select',
  131. fieldName: 'taskFrequency',
  132. label: '任务频率',
  133. componentProps: {
  134. allowClear: true,
  135. placeholder: '请选择任务频率',
  136. options: getTaskFrequencyOptions(),
  137. defaultValue: 'daily',
  138. clearable: true,
  139. },
  140. },
  141. {
  142. component: 'Select',
  143. fieldName: 'status',
  144. label: '状态',
  145. componentProps: {
  146. allowClear: true,
  147. placeholder: '请选择状态',
  148. options: [
  149. { label: '关闭', value: '1' },
  150. { label: '启用', value: '0' },
  151. ],
  152. clearable: true,
  153. },
  154. },
  155. {
  156. component: 'Select',
  157. fieldName: 'level',
  158. label: '任务级别',
  159. componentProps: {
  160. allowClear: true,
  161. placeholder: '请选择任务级别',
  162. options: [
  163. { label: '低', value: '0' },
  164. { label: '中', value: '1' },
  165. { label: '高', value: '2' },
  166. ],
  167. clearable: true,
  168. },
  169. },
  170. {
  171. component: 'Select',
  172. fieldName: 'formType',
  173. label: '表单类型',
  174. componentProps: () => {
  175. return {
  176. allowClear: true,
  177. placeholder: '请选择表单类型',
  178. options: getFormTypeOptions(),
  179. clearable: true,
  180. };
  181. },
  182. },
  183. {
  184. component: 'Select',
  185. fieldName: 'isTiming',
  186. label: '定时分发',
  187. componentProps: {
  188. allowClear: true,
  189. placeholder: '请选择定时分发',
  190. options: [
  191. { label: '否', value: '0' },
  192. { label: '是', value: '1' },
  193. ],
  194. clearable: true,
  195. },
  196. },
  197. // {
  198. // component: 'Select',
  199. // fieldName: 'taskSource',
  200. // label: '任务来源',
  201. // componentProps: {
  202. // allowClear: true,
  203. // placeholder: '请选择任务来源',
  204. // optiolns: [
  205. // { label: '默认', value: '默认' },
  206. // { label: '新增', value: '新增' },
  207. // ],
  208. // clearable: true,
  209. // },
  210. // },
  211. ];
  212. export const tableColumns: VxeGridProps['columns'] = [
  213. {
  214. type: 'checkbox',
  215. width: 80,
  216. },
  217. {
  218. field: 'taskName',
  219. title: '任务名称',
  220. minWidth: 150,
  221. },
  222. {
  223. field: 'taskTypeName',
  224. title: '任务类型',
  225. minWidth: 120,
  226. },
  227. {
  228. field: 'formTypeName',
  229. title: '表单类型',
  230. minWidth: 120,
  231. },
  232. {
  233. field: 'taskLeader',
  234. title: '任务负责人',
  235. minWidth: 120,
  236. slots: { default: 'taskLeader' },
  237. },
  238. {
  239. field: 'executePosition',
  240. title: '执行岗位',
  241. minWidth: 120,
  242. slots: { default: 'executePosition' },
  243. },
  244. {
  245. field: 'taskFrequency',
  246. title: '任务频率',
  247. minWidth: 120,
  248. slots: { default: 'taskFrequency' },
  249. },
  250. {
  251. field: 'status',
  252. title: '状态',
  253. minWidth: 100,
  254. slots: { default: 'status' },
  255. },
  256. {
  257. field: 'isTiming',
  258. title: '定时分发',
  259. minWidth: 100,
  260. slots: { default: 'isTiming' },
  261. },
  262. // {
  263. // field: 'taskSource',
  264. // title: '任务来源',
  265. // minWidth: 100,
  266. // },
  267. // {
  268. // field: 'operator',
  269. // title: '操作人',
  270. // minWidth: 120,
  271. // },
  272. // {
  273. // field: 'operationTime',
  274. // title: '操作时间',
  275. // minWidth: 180,
  276. // },
  277. {
  278. field: 'action',
  279. fixed: 'right',
  280. slots: { default: 'action' },
  281. title: '操作',
  282. width: 300,
  283. },
  284. ];
  285. // 定义通用的是/否选项
  286. const yesNoOptions = [
  287. { label: '是', value: '1' },
  288. { label: '否', value: '0' },
  289. ];
  290. export const drawerFormSchema: FormSchemaGetter = (props?: any) => [
  291. {
  292. component: 'Input',
  293. dependencies: {
  294. show: () => false,
  295. triggerFields: [''],
  296. },
  297. fieldName: 'id',
  298. formItemClass: 'col-span-2 items-baseline',
  299. },
  300. {
  301. component: 'Input',
  302. dependencies: {
  303. show: () => false,
  304. triggerFields: [''],
  305. },
  306. fieldName: 'isUpdate',
  307. formItemClass: 'col-span-2 items-baseline',
  308. },
  309. {
  310. component: 'Input',
  311. fieldName: 'executePosition',
  312. dependencies: {
  313. show: () => false,
  314. triggerFields: [''],
  315. },
  316. },
  317. {
  318. component: 'Select',
  319. fieldName: 'executePositions',
  320. label: '执行岗位',
  321. componentProps: (data: any, form: any) => {
  322. return {
  323. allowClear: true,
  324. multiple: true,
  325. placeholder: '请选择执行岗位',
  326. options: positionsOptions,
  327. clearable: true,
  328. onChange: () => {
  329. // 判断选择的数据是否有不同类型的
  330. const posts = data.executePositions;
  331. const type: any = [];
  332. for (const item of posts) {
  333. const info = positionsOptions.find((i: any) => i.value === item);
  334. if (type.includes(info.type)) {
  335. continue;
  336. }
  337. type.push(info.type);
  338. }
  339. if (type.length > 1) {
  340. ElMessage.error('选择的岗位类型不能不同');
  341. form.setFieldValue('executePositions', '');
  342. form.setFieldValue('executePosition', '');
  343. } else {
  344. form.setFieldValue(
  345. 'executePosition',
  346. data.executePositions.join(','),
  347. );
  348. }
  349. },
  350. };
  351. },
  352. rules: 'required',
  353. formItemClass: 'col-span-2 items-baseline',
  354. },
  355. {
  356. component: 'Input',
  357. fieldName: 'taskName',
  358. label: '任务名称',
  359. componentProps: {
  360. placeholder: '请输入任务名称',
  361. maxlength: 100,
  362. clearable: true,
  363. },
  364. rules: 'required',
  365. formItemClass: 'col-span-2 items-baseline',
  366. },
  367. {
  368. component: 'Select',
  369. fieldName: 'taskType',
  370. label: '任务类型',
  371. componentProps: (data: any) => {
  372. return {
  373. placeholder: '请选择任务类型',
  374. options: getTaskTypeOptions(),
  375. clearable: true,
  376. disabled: data.isUpdate,
  377. };
  378. },
  379. rules: 'required',
  380. formItemClass: 'col-span-2 items-baseline',
  381. },
  382. {
  383. component: 'ApiSelect',
  384. fieldName: 'taskLeader',
  385. label: '任务负责人',
  386. componentProps: {
  387. placeholder: '请选择任务来源',
  388. clearable: true,
  389. api: async () => {
  390. const resp: any = await getUserList({
  391. pageNum: 1,
  392. pageSize: 100,
  393. postId: 1,
  394. });
  395. return resp.rows.map((item: any) => ({
  396. label: item.nickName || item.userName,
  397. value: item.userId.toString(),
  398. }));
  399. },
  400. showSearch: true,
  401. filterable: true,
  402. remote: true,
  403. reserveKeyword: true,
  404. // filterable: true,
  405. remoteMethod: async (params: any) => {
  406. const resp: any = await getUserList({
  407. pageNum: 1,
  408. pageSize: 100,
  409. userName: params.query,
  410. });
  411. return resp.rows.map((item: any) => ({
  412. label: item.nickName || item.userName,
  413. value: item.userId.toString(),
  414. }));
  415. },
  416. labelField: 'label',
  417. valueField: 'value',
  418. },
  419. formItemClass: 'col-span-2 items-baseline',
  420. },
  421. {
  422. component: 'Select',
  423. fieldName: 'formType',
  424. label: '表单类型',
  425. componentProps: (data: any) => {
  426. return {
  427. placeholder: '请选择表单类型',
  428. options: getFormTypeOptions().filter(
  429. (item: any) => item.value !== 'form',
  430. ),
  431. clearable: true,
  432. disabled: data.isUpdate,
  433. };
  434. },
  435. rules: 'required',
  436. formItemClass: 'col-span-2 items-baseline',
  437. },
  438. {
  439. component: 'ApiSelect',
  440. fieldName: 'checklist',
  441. label: '关联表名称',
  442. componentProps: {
  443. placeholder: '请选择油站',
  444. clearable: true,
  445. api: async () => {
  446. const resp = await queryCheckFormList({
  447. pageSize: 10_000,
  448. });
  449. const data = resp?.rows || [];
  450. return Array.isArray(data)
  451. ? data.map((item: any) => ({
  452. label: item.name,
  453. value: item.id,
  454. }))
  455. : [];
  456. },
  457. labelField: 'label',
  458. valueField: 'value',
  459. },
  460. dependencies: {
  461. show(values: any) {
  462. return values.formType === 'inspection';
  463. },
  464. required(values: any) {
  465. return values.formType === 'inspection';
  466. },
  467. triggerFields: ['formType'],
  468. },
  469. },
  470. // {
  471. // component: 'Select',
  472. // fieldName: 'formType',
  473. // label: '关联表名称',
  474. // dependencies: {
  475. // show: (values: any) => values.formType === 'inspection',
  476. // triggerFields: ['formType'],
  477. // },
  478. // componentProps: {
  479. // placeholder: '请选择关联表名称',
  480. // options: getFormTypeOptions(),
  481. // clearable: true,
  482. // },
  483. // rules: 'required',
  484. // formItemClass: 'col-span-2 items-baseline',
  485. // },
  486. {
  487. component: 'RadioGroup',
  488. fieldName: 'isLicensable',
  489. label: '可授权',
  490. defaultValue: '1',
  491. componentProps: createRadioConfig(yesNoOptions),
  492. rules: 'required',
  493. formItemClass: 'col-span-2 items-baseline',
  494. dependencies: {
  495. show(formValues: any) {
  496. if (!formValues.executePositions) {
  497. return true;
  498. }
  499. const posts = formValues.executePositions;
  500. const type: any = [];
  501. for (const item of posts) {
  502. const info = positionsOptions.find((i: any) => i.value === item);
  503. if (info && !type.includes(info.type)) {
  504. type.push(info.type);
  505. }
  506. }
  507. return !type.includes('management');
  508. },
  509. triggerFields: ['executePositions'],
  510. },
  511. },
  512. {
  513. component: 'RadioGroup',
  514. fieldName: 'isRating',
  515. label: '评分',
  516. defaultValue: '1',
  517. componentProps: createRadioConfig(yesNoOptions),
  518. rules: 'required',
  519. formItemClass: 'col-span-2 items-baseline',
  520. },
  521. {
  522. component: 'RadioGroup',
  523. fieldName: 'isMust',
  524. label: '必做',
  525. defaultValue: '1',
  526. componentProps: createRadioConfig(yesNoOptions),
  527. rules: 'required',
  528. formItemClass: 'col-span-2 items-baseline',
  529. },
  530. {
  531. component: 'RadioGroup',
  532. fieldName: 'distributionMethod',
  533. label: '分发逻辑',
  534. formItemClass: 'col-span-2 items-baseline',
  535. dependencies: {
  536. show(formValues: any) {
  537. if (!formValues.executePositions) {
  538. return false;
  539. }
  540. const posts = formValues.executePositions;
  541. const type: any = [];
  542. for (const item of posts) {
  543. const info = positionsOptions.find((i: any) => i.value === item);
  544. if (info && !type.includes(info.type)) {
  545. type.push(info.type);
  546. }
  547. }
  548. return (
  549. type.includes('headquarters') ||
  550. type.includes('region') ||
  551. type.includes('management')
  552. );
  553. },
  554. triggerFields: ['executePositions'],
  555. },
  556. },
  557. {
  558. component: 'RadioGroup',
  559. fieldName: 'executionMethod',
  560. label: '执行方式',
  561. defaultValue: '1',
  562. componentProps: createRadioConfig([
  563. { label: '人工', value: '1' },
  564. { label: '自动', value: '0' },
  565. ]),
  566. formItemClass: 'col-span-2 items-baseline',
  567. },
  568. {
  569. component: 'Select',
  570. fieldName: 'taskFrequency',
  571. label: '任务频率',
  572. defaultValue: 'daily',
  573. componentProps: (_: any, formApi: any) => {
  574. return {
  575. placeholder: '请选择任务频率',
  576. options: getTaskFrequencyOptions(),
  577. clearable: true,
  578. onChange: (value: any) => {
  579. // 重置时间相关字段
  580. // if (value === 'yearly') {
  581. // formApi.setFieldValue('startTimeMonth', '1');
  582. // formApi.setFieldValue('startTimeYearDay', '1');
  583. // formApi.setFieldValue('endTimeMonth', '1');
  584. // formApi.setFieldValue('endTimeYearDay', '1');
  585. // } else {
  586. formApi.setFieldValue('startTimeDay', '1');
  587. formApi.setFieldValue('startTimeHour', '0');
  588. formApi.setFieldValue('endTimeDay', '1');
  589. formApi.setFieldValue('endTimeHour', '23');
  590. // }
  591. // 重置其他字段
  592. formApi.setFieldValue('planTime', 1);
  593. formApi.setFieldValue('invalidDays', 0);
  594. formApi.setFieldValue('daysInterval', 0);
  595. formApi.setFieldValue('warningTime', 0);
  596. },
  597. };
  598. },
  599. rules: 'required',
  600. formItemClass: 'col-span-2 items-baseline',
  601. },
  602. // 每天一次 daily
  603. // 每周一次 weekly
  604. // 每月一次 monthly
  605. // 每两月一次 every_two_months
  606. // 每三月一次 every_three_months
  607. // 每六月一次 every_six_months
  608. // 每年一次 yearly
  609. // 非 yearly 任务的时间设置
  610. {
  611. component: 'Select',
  612. fieldName: 'startTimeDay',
  613. label: '开始时间 天',
  614. defaultValue: '1',
  615. componentProps: (_: any, formApi: any) => {
  616. return {
  617. clearable: true,
  618. placeholder: '请输入开始时间(天)',
  619. options: Array.from({ length: 24 }, (_, i) => ({
  620. label: i.toString().padStart(2, '0'),
  621. value: i,
  622. })),
  623. onChange: () => {
  624. formApi.setFieldValue('endTimeDay', '');
  625. },
  626. // style: { width: '160px' },
  627. };
  628. },
  629. dependencies: {
  630. show: (values: any) => values.taskFrequency !== 'yearly',
  631. componentProps(values: any, formApi: any) {
  632. let options = [];
  633. const defaultValue = '1';
  634. if (values.taskFrequency === 'daily') {
  635. options = [
  636. {
  637. label: '-1',
  638. value: '-1',
  639. },
  640. {
  641. label: '1',
  642. value: '1',
  643. },
  644. ];
  645. } else if (values.taskFrequency === 'weekly') {
  646. options = Array.from({ length: 7 }, (_, i) => ({
  647. label: (i + 1).toString(),
  648. value: i + 1,
  649. }));
  650. } else {
  651. let count = 7;
  652. switch (values.taskFrequency) {
  653. case 'every_six_months': {
  654. count = 180;
  655. break;
  656. }
  657. case 'every_three_months': {
  658. count = 90;
  659. break;
  660. }
  661. case 'every_two_months': {
  662. count = 60;
  663. break;
  664. }
  665. case 'monthly': {
  666. count = 30;
  667. break;
  668. }
  669. // No default
  670. }
  671. options = Array.from({ length: count }, (_, i) => ({
  672. label: (i + 1).toString(),
  673. value: i + 1,
  674. }));
  675. }
  676. return {
  677. options,
  678. defaultValue,
  679. };
  680. },
  681. triggerFields: ['taskFrequency'],
  682. },
  683. // rules: 'required',
  684. // slot: 'startTimeDay',
  685. },
  686. {
  687. component: 'Select',
  688. fieldName: 'startTimeHour',
  689. label: '时',
  690. defaultValue: '00',
  691. componentProps: {
  692. clearable: true,
  693. placeholder: '请输入开始时间(小时)',
  694. options: Array.from({ length: 24 }, (_, i) => ({
  695. label: i.toString().padStart(2, '0'),
  696. value: i,
  697. })),
  698. // type: 'number',
  699. // placeholder: '请输入开始时间(小时)',
  700. // min: 0,
  701. // style: { width: '160px' },
  702. },
  703. dependencies: {
  704. show: (values: any) => values.taskFrequency !== 'yearly',
  705. componentProps(values: any) {
  706. return {
  707. options: Array.from({ length: 24 }, (_, i) => ({
  708. label: i.toString().padStart(2, '0'),
  709. value: i,
  710. })),
  711. defaultValue: '0',
  712. };
  713. },
  714. triggerFields: ['taskFrequency'],
  715. },
  716. // rules: 'required',
  717. // slot: 'startTimeHour',
  718. },
  719. {
  720. component: 'Select',
  721. fieldName: 'endTimeDay',
  722. label: '结束时间 天',
  723. defaultValue: '1',
  724. dependencies: {
  725. show: (values: any) => values.taskFrequency !== 'yearly',
  726. disabled: (values: any) =>
  727. (Array.isArray(values.endoftheperiod) &&
  728. values.endoftheperiod.length > 0) ||
  729. (values.taskFrequency !== 'daily' &&
  730. values.taskFrequency !== 'yearly' &&
  731. Array.isArray(values.isCycleEnd) &&
  732. values.isCycleEnd[0] === true),
  733. componentProps(values: any) {
  734. const startDay = Number.parseInt(values.startTimeDay) || 1;
  735. switch (values.taskFrequency) {
  736. case 'daily': {
  737. return {
  738. options: [
  739. { label: '1', value: '1' },
  740. { label: '2', value: '2' },
  741. ],
  742. defaultValue: '1',
  743. };
  744. }
  745. case 'every_six_months': {
  746. const count = 180 - startDay + 1;
  747. return {
  748. options: Array.from({ length: count }, (_, i) => ({
  749. label: (startDay + i).toString(),
  750. value: startDay + i,
  751. })),
  752. defaultValue: startDay.toString(),
  753. };
  754. }
  755. case 'every_three_months': {
  756. const count = 90 - startDay + 1;
  757. return {
  758. options: Array.from({ length: count }, (_, i) => ({
  759. label: (startDay + i).toString(),
  760. value: startDay + i,
  761. })),
  762. defaultValue: startDay.toString(),
  763. };
  764. }
  765. case 'every_two_months': {
  766. const count = 60 - startDay + 1;
  767. return {
  768. options: Array.from({ length: count }, (_, i) => ({
  769. label: (startDay + i).toString(),
  770. value: startDay + i,
  771. })),
  772. defaultValue: startDay.toString(),
  773. };
  774. }
  775. case 'monthly': {
  776. const count = 30 - startDay + 1;
  777. return {
  778. options: Array.from({ length: count }, (_, i) => ({
  779. label: (startDay + i).toString(),
  780. value: startDay + i,
  781. })),
  782. defaultValue: startDay.toString(),
  783. };
  784. }
  785. case 'weekly': {
  786. return {
  787. options: Array.from({ length: 7 - startDay + 1 }, (_, i) => ({
  788. label: (startDay + i).toString(),
  789. value: startDay + i,
  790. })),
  791. defaultValue: startDay.toString(),
  792. };
  793. }
  794. // No default
  795. }
  796. return {
  797. defaultValue: '1',
  798. };
  799. },
  800. triggerFields: [
  801. 'endoftheperiod',
  802. 'isCycleEnd',
  803. 'taskFrequency',
  804. 'startTimeDay',
  805. ],
  806. },
  807. componentProps: {
  808. clearable: true,
  809. placeholder: '请输入结束时间(天)',
  810. options: Array.from({ length: 24 }, (_, i) => ({
  811. label: i.toString(),
  812. value: i,
  813. })),
  814. // style: { width: '160px' },
  815. },
  816. rules: 'required',
  817. },
  818. {
  819. component: 'Select',
  820. fieldName: 'endTimeHour',
  821. label: '时',
  822. defaultValue: '23',
  823. dependencies: {
  824. show: (values: any) => values.taskFrequency !== 'yearly',
  825. disabled: (values: any) =>
  826. (Array.isArray(values.endoftheperiod) &&
  827. values.endoftheperiod.length > 0) ||
  828. (values.taskFrequency !== 'daily' &&
  829. values.taskFrequency !== 'yearly' &&
  830. Array.isArray(values.isCycleEnd) &&
  831. values.isCycleEnd[0] === true),
  832. componentProps(values: any) {
  833. return {
  834. defaultValue: '23',
  835. };
  836. },
  837. triggerFields: ['endoftheperiod', 'isCycleEnd', 'taskFrequency'],
  838. },
  839. componentProps: {
  840. clearable: true,
  841. placeholder: '请输入结束时间(小时)',
  842. options: Array.from({ length: 24 }, (_, i) => ({
  843. label: i.toString().padStart(2, '0'),
  844. value: i,
  845. })),
  846. // style: { width: '160px' },
  847. },
  848. // rules: 'required',
  849. },
  850. // yearly 任务的时间设置
  851. {
  852. component: 'Select',
  853. fieldName: 'startTimeMonth',
  854. label: '开始时间 月',
  855. defaultValue: '1',
  856. componentProps: (_: any, formApi: any) => {
  857. return {
  858. clearable: true,
  859. placeholder: '请输入开始时间(月)',
  860. options: Array.from({ length: 12 }, (_, i) => ({
  861. label: (i + 1).toString(),
  862. value: i + 1,
  863. })),
  864. onChange: () => {
  865. formApi.setFieldValue('endTimeMonth', '');
  866. formApi.setFieldValue('endTimeYearDay', '');
  867. },
  868. };
  869. },
  870. dependencies: {
  871. show: (values: any) => values.taskFrequency === 'yearly',
  872. componentProps(values: any, formApi: any) {
  873. return {};
  874. },
  875. triggerFields: ['taskFrequency'],
  876. },
  877. // rules: 'required',
  878. },
  879. {
  880. component: 'Select',
  881. fieldName: 'startTimeYearDay',
  882. label: '开始时间 天',
  883. defaultValue: '1',
  884. componentProps: (_: any, formApi: any) => {
  885. return {
  886. clearable: true,
  887. placeholder: '请输入开始时间(天)',
  888. options: Array.from({ length: 31 }, (_, i) => ({
  889. label: (i + 1).toString(),
  890. value: i + 1,
  891. })),
  892. onChange: () => {
  893. formApi.setFieldValue('endTimeYearDay', '');
  894. },
  895. };
  896. },
  897. dependencies: {
  898. show: (values: any) => values.taskFrequency === 'yearly',
  899. triggerFields: ['taskFrequency'],
  900. },
  901. // rules: 'required',
  902. },
  903. {
  904. component: 'Select',
  905. fieldName: 'endTimeMonth',
  906. label: '结束时间 月',
  907. defaultValue: '1',
  908. dependencies: {
  909. show: (values: any) => values.taskFrequency === 'yearly',
  910. disabled: (values: any) =>
  911. (Array.isArray(values.endoftheperiod) &&
  912. values.endoftheperiod.length > 0) ||
  913. (values.taskFrequency !== 'daily' &&
  914. values.taskFrequency !== 'yearly' &&
  915. Array.isArray(values.isCycleEnd) &&
  916. values.isCycleEnd[0] === true),
  917. componentProps(values: any) {
  918. const startMonth = Number.parseInt(values.startTimeMonth) || 1;
  919. const startDay = Number.parseInt(values.startTimeYearDay) || 1;
  920. return {
  921. options: Array.from({ length: 12 - startMonth + 1 }, (_, i) => ({
  922. label: (startMonth + i).toString(),
  923. value: startMonth + i,
  924. })),
  925. defaultValue: startMonth.toString(),
  926. };
  927. },
  928. triggerFields: [
  929. 'endoftheperiod',
  930. 'isCycleEnd',
  931. 'taskFrequency',
  932. 'startTimeMonth',
  933. ],
  934. },
  935. componentProps: {
  936. clearable: true,
  937. placeholder: '请输入结束时间(月)',
  938. options: Array.from({ length: 12 }, (_, i) => ({
  939. label: (i + 1).toString(),
  940. value: i + 1,
  941. })),
  942. },
  943. rules: 'required',
  944. },
  945. {
  946. component: 'Select',
  947. fieldName: 'endTimeYearDay',
  948. label: '结束时间 天',
  949. defaultValue: '1',
  950. dependencies: {
  951. show: (values: any) => values.taskFrequency === 'yearly',
  952. disabled: (values: any) =>
  953. (Array.isArray(values.endoftheperiod) &&
  954. values.endoftheperiod.length > 0) ||
  955. (values.taskFrequency !== 'daily' &&
  956. values.taskFrequency !== 'yearly' &&
  957. Array.isArray(values.isCycleEnd) &&
  958. values.isCycleEnd[0] === true),
  959. componentProps(values: any) {
  960. const startMonth = Number.parseInt(values.startTimeMonth) || 1;
  961. const startDay = Number.parseInt(values.startTimeYearDay) || 1;
  962. const endMonth = Number.parseInt(values.endTimeMonth) || 1;
  963. const month = endMonth;
  964. // 计算每个月的天数
  965. let daysInMonth = 31;
  966. if ([4, 6, 9, 11].includes(month)) {
  967. daysInMonth = 30;
  968. } else if (month === 2) {
  969. daysInMonth = 28; // 简化处理,不考虑闰年
  970. }
  971. // 如果是同月,结束天数必须大于等于开始天数
  972. // 如果是跨月,结束天数可以从1号开始
  973. const start = startMonth === endMonth ? startDay : 1;
  974. const count = daysInMonth - start + 1;
  975. return {
  976. options: Array.from({ length: count }, (_, i) => ({
  977. label: (start + i).toString(),
  978. value: start + i,
  979. })),
  980. defaultValue: start.toString(),
  981. };
  982. },
  983. triggerFields: [
  984. 'endoftheperiod',
  985. 'isCycleEnd',
  986. 'taskFrequency',
  987. 'startTimeMonth',
  988. 'startTimeYearDay',
  989. 'endTimeMonth',
  990. ],
  991. },
  992. componentProps: {
  993. clearable: true,
  994. placeholder: '请输入结束时间(天)',
  995. options: Array.from({ length: 31 }, (_, i) => ({
  996. label: (i + 1).toString(),
  997. value: i + 1,
  998. })),
  999. },
  1000. // rules: 'required',
  1001. },
  1002. // 是否周期末0否1是
  1003. {
  1004. component: 'CheckboxGroup',
  1005. fieldName: 'isCycleEnd',
  1006. label: '周期末',
  1007. componentProps: {
  1008. options: [
  1009. {
  1010. label: '',
  1011. value: true,
  1012. },
  1013. ],
  1014. },
  1015. dependencies: {
  1016. show: (values: any) =>
  1017. values.taskFrequency !== 'daily' && values.taskFrequency !== 'yearly',
  1018. triggerFields: ['taskFrequency'],
  1019. },
  1020. formItemClass: 'col-span-2 items-baseline',
  1021. },
  1022. {
  1023. component: 'InputNumber',
  1024. fieldName: 'planTime',
  1025. label: '计划时间',
  1026. defaultValue: 1,
  1027. componentProps: {
  1028. type: 'number',
  1029. placeholder: '请输入计划时间',
  1030. min: 0,
  1031. },
  1032. dependencies: {
  1033. disabled: (values: any) =>
  1034. values.taskFrequency === 'daily' || values.taskFrequency === 'yearly',
  1035. componentProps(values: any) {
  1036. const min = Number.parseInt(values.startTimeDay) || 1;
  1037. const max = Number.parseInt(values.endTimeDay) || 365;
  1038. return {
  1039. min,
  1040. max,
  1041. };
  1042. },
  1043. triggerFields: ['taskFrequency', 'startTimeDay', 'endTimeDay'],
  1044. },
  1045. rules: 'required',
  1046. formItemClass: 'col-span-2 items-baseline',
  1047. },
  1048. {
  1049. component: 'InputNumber',
  1050. fieldName: 'invalidDays',
  1051. label: '失效天数',
  1052. defaultValue: 0,
  1053. componentProps: {
  1054. placeholder: '请输入失效天数',
  1055. min: 0,
  1056. },
  1057. dependencies: {
  1058. componentProps(values: any) {
  1059. if (values.taskFrequency === 'daily') {
  1060. return {
  1061. min: 0,
  1062. max: 1,
  1063. };
  1064. }
  1065. return {
  1066. min: 0,
  1067. };
  1068. },
  1069. triggerFields: ['taskFrequency'],
  1070. },
  1071. rules: 'required',
  1072. formItemClass: 'col-span-2 items-baseline',
  1073. },
  1074. {
  1075. component: 'InputNumber',
  1076. fieldName: 'daysInterval',
  1077. label: '间隔天数',
  1078. defaultValue: 0,
  1079. componentProps: {
  1080. placeholder: '请输入间隔天数',
  1081. min: 0,
  1082. },
  1083. dependencies: {
  1084. disabled: (values: any) => values.taskFrequency === 'daily',
  1085. triggerFields: ['taskFrequency'],
  1086. },
  1087. rules: 'required',
  1088. formItemClass: 'col-span-2 items-baseline',
  1089. },
  1090. {
  1091. component: 'InputNumber',
  1092. fieldName: 'warningTime',
  1093. label: '预警时间',
  1094. defaultValue: 0,
  1095. componentProps: {
  1096. placeholder: '请输入预警时间',
  1097. min: 0,
  1098. },
  1099. formItemClass: 'col-span-2 items-baseline',
  1100. },
  1101. {
  1102. component: 'Select',
  1103. fieldName: 'level',
  1104. label: '任务级别',
  1105. componentProps: {
  1106. placeholder: '请选择任务级别',
  1107. options: [
  1108. { label: '低', value: '0' },
  1109. { label: '中', value: '1' },
  1110. { label: '高', value: '2' },
  1111. ],
  1112. clearable: true,
  1113. },
  1114. formItemClass: 'col-span-2 items-baseline',
  1115. },
  1116. {
  1117. component: 'ApiSelect',
  1118. fieldName: 'repel',
  1119. label: '任务排斥',
  1120. componentProps: {
  1121. placeholder: '请选择任务排斥',
  1122. api: async () => {
  1123. const resp = await querybaseApilist({
  1124. pageSize: 10_000,
  1125. });
  1126. const data = resp?.rows || [];
  1127. return Array.isArray(data)
  1128. ? data.map((item: any) => ({
  1129. label: item.taskName,
  1130. value: item.id,
  1131. }))
  1132. : [];
  1133. },
  1134. labelField: 'label',
  1135. valueField: 'value',
  1136. clearable: true,
  1137. },
  1138. formItemClass: 'col-span-2 items-baseline',
  1139. },
  1140. {
  1141. // component: 'Input',
  1142. fieldName: 'icon',
  1143. label: '任务图标',
  1144. componentProps: {
  1145. placeholder: '请输入任务图标',
  1146. clearable: true,
  1147. },
  1148. rules: 'required',
  1149. slot: 'icon',
  1150. formItemClass: 'col-span-2 items-baseline',
  1151. },
  1152. {
  1153. component: 'Input',
  1154. fieldName: 'description',
  1155. label: '任务描述',
  1156. componentProps: {
  1157. placeholder: '请输入任务描述',
  1158. rows: 10,
  1159. clearable: true,
  1160. },
  1161. // 使用自定义插槽渲染Tinymce编辑器
  1162. slot: 'description',
  1163. formItemClass: 'col-span-2 items-baseline',
  1164. },
  1165. // 知识库
  1166. {
  1167. component: 'Input',
  1168. dependencies: {
  1169. show: () => false,
  1170. triggerFields: [''],
  1171. },
  1172. fieldName: 'knowledge',
  1173. formItemClass: 'col-span-2 items-baseline',
  1174. },
  1175. // 知识库类别
  1176. {
  1177. component: 'Input',
  1178. dependencies: {
  1179. show: () => false,
  1180. triggerFields: [''],
  1181. },
  1182. fieldName: 'knowledgeCategory',
  1183. formItemClass: 'col-span-2 items-baseline',
  1184. },
  1185. {
  1186. component: 'Input',
  1187. fieldName: 'standardGuidelineName',
  1188. label: '标准指引',
  1189. componentProps: {
  1190. placeholder: '请选择标准指引',
  1191. clearable: true,
  1192. },
  1193. renderComponentContent: (row: any, formApi: any) => {
  1194. return {
  1195. suffix: () => {
  1196. return (
  1197. <ElButton
  1198. onClick={() => {
  1199. props?.quoteModalApi?.open();
  1200. }}
  1201. type="primary"
  1202. >
  1203. 选择
  1204. </ElButton>
  1205. );
  1206. },
  1207. };
  1208. },
  1209. formItemClass: 'col-span-2 items-baseline',
  1210. },
  1211. {
  1212. component: 'Upload',
  1213. fieldName: 'attachment',
  1214. label: '附件',
  1215. // 注意:该组件的详细实现已在taskTemplate-drawer.vue中通过插槽自定义
  1216. // 这里仅保留基本配置,实际渲染由插槽控制
  1217. componentProps: {
  1218. // 基础配置
  1219. action: '#',
  1220. multiple: true,
  1221. },
  1222. formItemClass: 'col-span-2 items-baseline',
  1223. },
  1224. {
  1225. component: 'RadioGroup',
  1226. fieldName: 'status',
  1227. label: '任务状态',
  1228. componentProps: {
  1229. options: [
  1230. { label: '启用', value: '0' },
  1231. { label: '关闭', value: '1' },
  1232. ],
  1233. defaultValue: '启用',
  1234. },
  1235. rules: 'required',
  1236. formItemClass: 'col-span-2 items-baseline',
  1237. },
  1238. {
  1239. component: 'RadioGroup',
  1240. fieldName: 'isTiming',
  1241. label: '定时分发',
  1242. componentProps: {
  1243. options: [
  1244. { label: '是', value: '1' },
  1245. { label: '否', value: '0' },
  1246. ],
  1247. defaultValue: '是',
  1248. },
  1249. rules: 'required',
  1250. formItemClass: 'col-span-2 items-baseline',
  1251. },
  1252. ];
  1253. export const formActions = [
  1254. {
  1255. type: 'button',
  1256. text: '查询',
  1257. submit: true,
  1258. buttonProps: { type: 'primary' },
  1259. },
  1260. { type: 'button', text: '重置', reset: true },
  1261. {
  1262. type: 'button',
  1263. text: '导出',
  1264. buttonProps: { type: 'primary', ghost: true },
  1265. },
  1266. ];