task.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <div class="tasks main-background main-background-type0">
  3. <div class="nav-placeholder">
  4. </div>
  5. <section class="main-section">
  6. <div class="content">
  7. <a-button :icon="h(ArrowLeftOutlined)" class="mb-3" @click="router.back()">返回上一页</a-button>
  8. <div class="d-flex flex-column" v-if="currentTaskDefItem" :padding="30" :gap="10">
  9. <img
  10. v-if="currentTaskDefItem.banner"
  11. :src="currentTaskDefItem.banner"
  12. mode="widthFix"
  13. />
  14. <TaskList>
  15. <TaskItem
  16. v-for="item in currentTaskDefItem.list"
  17. :key="item.title"
  18. :icon="item.icon"
  19. :title="item.title"
  20. :desc="item.desc"
  21. :enable="typeof item.enable === 'string' ? canCollect(item.enable) : item.enable"
  22. @click="handleClick(item)"
  23. />
  24. </TaskList>
  25. </div>
  26. </div>
  27. </section>
  28. </div>
  29. </template>
  30. <script setup lang="ts">
  31. import { ref, h } from 'vue';
  32. import { useRouter } from 'vue-router';
  33. import { useLoadQuerys } from '@imengyu/imengyu-web-shared';
  34. import { useCollectStore } from '@/stores/collect';
  35. import { useTaskEntryForm } from '../composeable/TaskEntryForm';
  36. import { TaskMenuDef, type TaskMenuDefItem } from './tasks';
  37. import { ArrowLeftOutlined } from '@ant-design/icons-vue';
  38. import { getVillageInfoForm } from './forms';
  39. import VillageApi from '@/api/inhert/VillageApi';
  40. import TaskList from '../components/TaskList.vue';
  41. import TaskItem from '../components/TaskItem.vue';
  42. const router = useRouter();
  43. const { goForm } = useTaskEntryForm();
  44. const { canCollect, getCollectModuleInternalNameById } = useCollectStore();
  45. useLoadQuerys({
  46. villageId: 0,
  47. taskName: '',
  48. taskPid: 0,
  49. }, async (querys) => {
  50. const { villageId, taskName, taskPid } = querys;
  51. currentTaskDefItem.value = { ...TaskMenuDef[taskName] };
  52. if (taskPid) {
  53. const res = (await VillageApi.getCatalogList(villageId, taskPid));
  54. if (res.length === 0)
  55. return;
  56. currentTaskDefItem.value.list = res
  57. .map(item => {
  58. try {
  59. const collectModuleInternalName = getCollectModuleInternalNameById(item.collectModuleId);
  60. if (!collectModuleInternalName && item.collectModuleId)
  61. throw new Error('不存在定义的表单数据');
  62. const formDefine = collectModuleInternalName ? getVillageInfoForm(collectModuleInternalName, -1) : undefined;
  63. return {
  64. ...item,
  65. enable: true,
  66. catalogItem: item,
  67. goForm: collectModuleInternalName ? [
  68. collectModuleInternalName,
  69. -1,
  70. formDefine?.[2].typeName,
  71. collectModuleInternalName === 'overview' ? 'common' : undefined,
  72. item.title
  73. ] : undefined,
  74. onClick: () => {
  75. if (item.haschild) {
  76. router.push({
  77. path: '/forms/task',
  78. query: {
  79. ...querys,
  80. taskName: item.title,
  81. taskPid: item.id,
  82. }
  83. })
  84. } else {
  85. alert({
  86. title: item.title,
  87. content: '不存在定义的表单数据',
  88. })
  89. }
  90. }
  91. }
  92. } catch (e) {
  93. return {
  94. ...item,
  95. desc: '' + e,
  96. enable: false,
  97. }
  98. }
  99. });
  100. }
  101. });
  102. const currentTaskDefItem = ref<TaskMenuDefItem | null>(null);
  103. const handleClick = (item: TaskMenuDefItem['list'][0]) => {
  104. if (item.goForm) {
  105. goForm(...item.goForm);
  106. return;
  107. }
  108. if (item.onClick) {
  109. item.onClick();
  110. }
  111. }
  112. </script>