Bladeren bron

📦 增加口述人管理

快乐的梦鱼 2 maanden geleden
bovenliggende
commit
36db65e2a3

+ 1 - 1
src/api/inhert/VillageInfoApi.ts

@@ -199,7 +199,7 @@ export class VillageInfoApi extends AppServerRequestModule<DataModel> {
       village_id: villageId,
       village_volunteer_id: villageVolunteerId,
     }, '获取信息详情'))
-      .then(res => transformArrayDataModel<T>(modelClassCreator, res.data2 || [], `获取分类列表`, true))
+      .then(res => transformArrayDataModel<T>(modelClassCreator, (res.data2.data || res.data2) ?? [], `获取分类列表`, true))
       .catch(e => { throw e });
   }
   async updateInfo<T extends DataModel>(

+ 16 - 0
src/pages/composeable/TaskEntryForm.ts

@@ -24,4 +24,20 @@ export function useTaskEntryForm() {
   return {
     goForm,
   }
+}
+
+
+export function goFormStatic(villageId: number, villageVolunteerId: number, subType: string, subId: number, subKey = 'type', type = 'list', subTitle = '') {
+  router.push({
+    path: '/forms/' + type, 
+    query: {
+      id: type === 'common' ? 1 : undefined,
+      villageId,  
+      villageVolunteerId,  
+      subType,
+      subId,
+      subKey,
+      subTitle,
+    }
+  })
 }

+ 6 - 2
src/pages/forms/common.vue

@@ -12,6 +12,10 @@
               ref="formRef"
               :model="(formModel as any)" 
               :options="formOptions"
+              :globalParams="{
+                villageId: querys.villageId,
+                villageVolunteerId: querys.villageVolunteerId,
+              }"
             />
             <div class="d-flex flex-column mt-3">
               <span>
@@ -37,7 +41,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, h, reactive, nextTick } from 'vue';
+import { ref, h, reactive, nextTick, type Ref } from 'vue';
 import { getVillageInfoForm } from './forms';
 import { RequestApiError, waitTimeOut } from '@imengyu/imengyu-utils';
 import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
@@ -126,7 +130,7 @@ const { querys } = useLoadQuerys({
   try {
     const [model, forms] = getVillageInfoForm(querys.subType, querys.subId);
     formModel.value = new model();
-    formOptions.value = forms(formRef);
+    formOptions.value = forms(formRef as Ref<IDynamicFormRef>);
     if (querys.id !== -1) {
       formData = await VillageInfoApi.getInfo(
         querys.subType, 

+ 64 - 12
src/pages/forms/data/cultural.ts

@@ -1,12 +1,13 @@
 import VillageInfoApi, { CommonInfoModel, VillageBulidingInfo } from "@/api/inhert/VillageInfoApi";
 import type { GroupForm, SingleForm } from "../forms";
-import type { IDynamicFormItemCallbackAdditionalProps } from "@/components/dynamic";
-import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
-import type { FieldProps } from "@/components/form/Field.vue";
+import type { IDynamicFormItemCallback, IDynamicFormItemCallbackAdditionalProps } from "@imengyu/vue-dynamic-form";
 import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
-import type { UploaderInstance } from "@/components/form/Uploader.vue";
-import type { UploaderFieldProps, UploaderFieldInstance } from "@/components/form/UploaderField.vue";
 import { villageCommonContent } from "./common";
+import { goFormStatic } from "@/pages/composeable/TaskEntryForm";
+import type { SelectIdProps } from "@imengyu/vue-dynamic-form-ant";
+import type { DataModel } from "@imengyu/js-request-transform";
+import type { ButtonProps } from "ant-design-vue";
+import { h } from "vue";
 
 export function villageInfoFolkCultureForm(title: string) : SingleForm {
   return [VillageBulidingInfo, (m) => ({
@@ -34,15 +35,15 @@ export function villageInfoFolkCultureForm(title: string) : SingleForm {
             callback: (m, r, p, i) => async () => 
               (await VillageInfoApi.getList(
                 'ich', undefined, undefined,
-                i.formGlobalParams.villageId,
-                i.formGlobalParams.villageVolunteerId
+                i.formGlobalParams.villageId as number,
+                i.formGlobalParams.villageVolunteerId as number
               )).map((p) => ({
                 value: p.id,
                 text: p.title,
+                raw: p,
               }))
           },
-        } as IDynamicFormItemCallbackAdditionalProps<PickerIdFieldProps>,
-        formProps: { showRightArrow: true } as FieldProps,
+        } as IDynamicFormItemCallbackAdditionalProps<SelectIdProps<DataModel>>,
         rules: [],
       },
       ...villageCommonContent(m, {
@@ -78,7 +79,7 @@ export const villageInfoCulture : GroupForm = {
           upload: useAliOssUploadCo('xiangyuan/cultural/scan'),
           maxFileSize: 1024 * 1024 * 20,
           maxUploadCount: 20,
-        } as UploaderFieldProps,
+        },
         rules: [{
           required: true,
           message: '请上传扫描件或图片',
@@ -93,6 +94,57 @@ export const villageInfoCulture : GroupForm = {
         showTitle: true
       }).formItems.slice(0, 1),
       {
+        label: '口述人', 
+        name: 'speakerId',
+        type: 'select-id', 
+        additionalProps: {
+          loadData: { 
+            callback(_, m, p, i) { 
+              return async () => (await VillageInfoApi.getList('speaker', undefined, undefined,
+                i.formGlobalParams.villageId as number,
+                i.formGlobalParams.villageVolunteerId as number
+              ))
+              .map((p) => ({
+                value: p.id,
+                text: p.name,
+                raw: p,
+              }))
+            } 
+          }
+        } as IDynamicFormItemCallbackAdditionalProps<SelectIdProps<DataModel>>,
+        rules: [{
+          required: true,
+          message: '请选择口述人',
+        }],
+      },
+      {
+        label: '口述人管理',
+        type: 'button',
+        name: 'manage',
+        defaultValue: '',
+        additionalSlot: {
+          default: () => h('span', {}, '口述人管理'),
+        },
+        additionalProps: {
+          onClick: { callback(v, m, p, i) {
+            return () => {
+              goFormStatic(
+                i.formGlobalParams.villageId as number,
+                i.formGlobalParams.villageVolunteerId as number,
+                'speaker',
+                1,
+                undefined,
+                undefined,
+                '口述人管理'
+              );
+            }
+          } } as IDynamicFormItemCallback<() => void>,
+        } as IDynamicFormItemCallbackAdditionalProps<ButtonProps>,
+        formProps: {
+          inputAlign: 'right'
+        },
+      },
+      {
         label: '口述历史视频/录音',
         name: 'video',
         type: 'uploader',
@@ -102,10 +154,10 @@ export const villageInfoCulture : GroupForm = {
           chooseType: 'video',
           maxFileSize: 1024 * 1024 * 20,
           single: true,
-        } as UploaderFieldProps,
+        },
         formProps: {
           extra: '您可以上传已经录制好的口述历史视频/录音来更生动地介绍历史。',
-        } as FieldProps,
+        },
       },
       /* {
         label: '',

+ 122 - 0
src/pages/forms/data/specker.ts

@@ -0,0 +1,122 @@
+import { CommonInfoModel } from "@/api/inhert/VillageInfoApi";
+import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
+import { villageCommonContent } from "./common";
+import type { SingleForm } from "../forms";
+
+export const villageInfoSpeakerForm : SingleForm = [CommonInfoModel, (r) => ({
+  formItems: [
+    {
+      label: '基本信息',
+      name: 'baseInfo',
+      type: 'flat-group',
+      childrenColProps: {
+        span: 24,
+      },
+      children: [
+        {
+          label: '标题',
+          name: 'name',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入标题',
+          },
+          rules: [{
+            required: true,
+            message: '请输入标题',
+          }]
+        },
+        {
+          label: '性别',
+          name: 'sex',
+          type: 'radio-id',
+          defaultValue: 3,
+          additionalProps: {
+            loadData: async () => [
+              { value: 1, text: '男' },
+              { value: 2, text: '女' },
+              { value: 3, text: '未知' },
+            ],
+          },
+          rules: [{
+            required: true,
+            message: '请选择性别',
+          }]
+        },
+        {
+          label: '联系方式',
+          name: 'mobile',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入联系方式',
+          },
+          rules: []
+        },
+        {
+          label: '生日',
+          name: 'birth',
+          type: 'datetime',
+          defaultValue: '',
+          additionalProps: {
+            type: 'date',
+          },
+          rules: [{
+            required: true,
+            message: '请选择生日',
+          }]
+        },
+      ]
+    },
+    {
+      label: '媒体信息',
+      name: 'mediaInfo',
+      type: 'flat-group',
+      childrenColProps: {
+        span: 24,
+      },
+      children: [
+        {
+          label: '图片',
+          name: 'image',
+          type: 'uploader',
+          defaultValue: '',
+          additionalProps: {
+            upload: useAliOssUploadCo('xiangyuan/speaker'),
+            maxFileSize: 1024 * 1024 * 20,
+            maxUploadCount: 1,
+          },
+          rules: []
+        },
+        {
+          label: '图片说明',
+          name: 'image_desc',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入图片说明',
+          },
+          rules: []
+        },
+        {
+          label: '音频',
+          name: 'audio',
+          type: 'uploader',
+          defaultValue: '',
+          additionalProps: {
+            upload: useAliOssUploadCo('xiangyuan/speaker/audio'),
+            maxFileSize: 1024 * 1024 * 50,
+            maxUploadCount: 1,
+            accept: 'audio/*',
+          },
+          rules: []
+        },
+        ...villageCommonContent(r, {
+          title: '口述人',
+          showTitle: false,
+          showContent: false,
+        }).formItems,
+      ]
+    },
+  ]
+})]

+ 8 - 15
src/pages/forms/forms.ts

@@ -1,16 +1,5 @@
-import VillageInfoApi, { CommonInfoModel, VillageBulidingInfo, VillageEnvInfo } from "@/api/inhert/VillageInfoApi";
-import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
-import type { IDynamicFormOptions, IDynamicFormItem, IDynamicFormRef, IDynamicFormItemCallbackAdditionalProps } from "@/components/dynamic";
-import type { CheckBoxListProps } from "@/components/dynamic/wrappers/CheckBoxList.vue";
-import type { CheckBoxToIntProps } from "@/components/dynamic/wrappers/CheckBoxToInt";
-import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
-import type { RadioIdFieldProps } from "@/components/dynamic/wrappers/RadioIdField";
-import type { FieldProps } from "@/components/form/Field.vue";
-import type { PickerFieldProps } from "@/components/form/PickerField.vue";
-import type { StepperProps } from "@/components/form/Stepper.vue";
-import type { UploaderInstance } from "@/components/form/Uploader.vue";
-import type { UploaderFieldInstance, UploaderFieldProps } from "@/components/form/UploaderField.vue";
-import type { RowProps } from "@/components/layout/grid/Row.vue";
+import { CommonInfoModel} from "@/api/inhert/VillageInfoApi";
+import type { IDynamicFormOptions, IDynamicFormRef } from "@imengyu/vue-dynamic-form";
 import type { NewDataModel } from "@imengyu/js-request-transform";
 import type { Ref } from "vue";
 import { villageCommonContent } from "./data/common";
@@ -24,6 +13,7 @@ import { villageInfoRelicForm } from "./data/relic";
 import { vilElementForm } from "./data/element";
 import { villageInfoFigureFormItems, villageInfoStoryFormItems } from "./data/history";
 import { villageInfoRouteForm, villageInfoTravelGuideForm } from "./data/travel";
+import { villageInfoSpeakerForm } from "./data/specker";
 
 export type SingleForm = [NewDataModel, (formRef: Ref<IDynamicFormRef>) => IDynamicFormOptions]
 export type GroupForm = Record<number, SingleForm>
@@ -34,6 +24,9 @@ const villageInfoForm : Record<string, GroupForm> = {
   'story': {
     [0]: villageInfoStoryFormItems
   },
+  'speaker': {
+    [1]: villageInfoSpeakerForm,
+  },
   'figure': {
     [0]: villageInfoFigureFormItems,
   },
@@ -86,7 +79,7 @@ const villageInfoForm : Record<string, GroupForm> = {
           defaultValue: '',
           additionalProps: {
             placeholder: '请输入标题',
-          } as FieldProps,
+          },
           rules: [{
             required: true,
             message: '请输入标题',
@@ -101,7 +94,7 @@ const villageInfoForm : Record<string, GroupForm> = {
             placeholder: '请输入描述',
             maxLength: 200,
             showWordLimit: true,
-          } as FieldProps,
+          },
           rules: []
         },
         ...villageCommonContent(r, {