|  | @@ -12,7 +12,8 @@ import {
 | 
	
		
			
				|  |  |    Popup,
 | 
	
		
			
				|  |  |    Radio,
 | 
	
		
			
				|  |  |    RadioGroup,
 | 
	
		
			
				|  |  | -  Tag
 | 
	
		
			
				|  |  | +  Tag,
 | 
	
		
			
				|  |  | +  showToast
 | 
	
		
			
				|  |  |  } from 'vant';
 | 
	
		
			
				|  |  |  import { activityStatus, programType } from '@/helpers/constant';
 | 
	
		
			
				|  |  |  import MUploader from '@/components/m-uploader';
 | 
	
	
		
			
				|  | @@ -25,18 +26,83 @@ import MSticky from '@/components/m-sticky';
 | 
	
		
			
				|  |  |  import { formatterDatePicker } from '@/helpers/utils';
 | 
	
		
			
				|  |  |  import request from '@/helpers/request';
 | 
	
		
			
				|  |  |  import InputTimer from './components/input-timer';
 | 
	
		
			
				|  |  | +import PerformanceTeam from './components/performance-team';
 | 
	
		
			
				|  |  | +import MPopup from '@/components/m-popup';
 | 
	
		
			
				|  |  | +import CastModal from './components/cast-modal';
 | 
	
		
			
				|  |  | +import dayjs from 'dayjs';
 | 
	
		
			
				|  |  | +import { useRoute, useRouter } from 'vue-router';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type detailItemType = {
 | 
	
		
			
				|  |  | +  id: string | number | null;
 | 
	
		
			
				|  |  | +  name: string;
 | 
	
		
			
				|  |  | +  type: string;
 | 
	
		
			
				|  |  | +  musicGroupId: string | null;
 | 
	
		
			
				|  |  | +  musicGroupName: string | null;
 | 
	
		
			
				|  |  | +  subjectAllList: any[];
 | 
	
		
			
				|  |  | +  subjectIdList: any[];
 | 
	
		
			
				|  |  | +  time: number | null;
 | 
	
		
			
				|  |  | +  performerList: any[];
 | 
	
		
			
				|  |  | +  attachmentUrl: string[];
 | 
	
		
			
				|  |  | +  attachmentVideoUrl: string[];
 | 
	
		
			
				|  |  | +  attachmentImgUrl: string[];
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const detailItem: detailItemType = {
 | 
	
		
			
				|  |  | +  id: null,
 | 
	
		
			
				|  |  | +  name: '',
 | 
	
		
			
				|  |  | +  type: '', // 节目类型
 | 
	
		
			
				|  |  | +  musicGroupId: null, // 表演乐团
 | 
	
		
			
				|  |  | +  musicGroupName: null, //
 | 
	
		
			
				|  |  | +  subjectAllList: [] as any, // 表演团队数据列表
 | 
	
		
			
				|  |  | +  subjectIdList: [] as any, // 表演团队
 | 
	
		
			
				|  |  | +  time: null, // 表演时间
 | 
	
		
			
				|  |  | +  performerList: [], // 演员列表
 | 
	
		
			
				|  |  | +  attachmentUrl: [] as string[],
 | 
	
		
			
				|  |  | +  attachmentVideoUrl: [] as string[], // 视频目录
 | 
	
		
			
				|  |  | +  attachmentImgUrl: [] as string[]
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 格式化时间
 | 
	
		
			
				|  |  | +export const formatterTimer = (timer: number) => {
 | 
	
		
			
				|  |  | +  if (!timer) {
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      minute: null,
 | 
	
		
			
				|  |  | +      secord: null
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    const minute = Math.floor(timer / 60);
 | 
	
		
			
				|  |  | +    const secord = timer % 60;
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      minute,
 | 
	
		
			
				|  |  | +      secord
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  export default defineComponent({
 | 
	
		
			
				|  |  |    name: 'operation-page',
 | 
	
		
			
				|  |  |    setup() {
 | 
	
		
			
				|  |  | +    const route = useRoute();
 | 
	
		
			
				|  |  | +    const router = useRouter();
 | 
	
		
			
				|  |  |      const forms = reactive({
 | 
	
		
			
				|  |  | +      activityDetailId: route.query.id, // 活动编号
 | 
	
		
			
				|  |  |        timerStatus: false,
 | 
	
		
			
				|  |  | -      submitEvaluateStatus: null,
 | 
	
		
			
				|  |  |        currentDate: [],
 | 
	
		
			
				|  |  |        orchestraStatus: false, // 乐团列表状态
 | 
	
		
			
				|  |  |        orchestraColumns: [] as any,
 | 
	
		
			
				|  |  |        programType: '',
 | 
	
		
			
				|  |  | -      programTimerStatus: true // 节目时长状态
 | 
	
		
			
				|  |  | +      programTimerStatus: false, // 节目时长状态
 | 
	
		
			
				|  |  | +      deleteStatus: false, // 删除弹窗
 | 
	
		
			
				|  |  | +      teamStatus: false, // 表演团队状态
 | 
	
		
			
				|  |  | +      castStatus: false, // 学员名称状态
 | 
	
		
			
				|  |  | +      selectOrchestra: [] as any, // 选中的乐团
 | 
	
		
			
				|  |  | +      // selectOrchestraIndex: 0, // index
 | 
	
		
			
				|  |  | +      deleteIndex: 0, // 删除的编号
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      startTime: dayjs().format('YYYY-MM-DD'),
 | 
	
		
			
				|  |  | +      name: '',
 | 
	
		
			
				|  |  | +      type: '',
 | 
	
		
			
				|  |  | +      detail: [{ ...detailItem }]
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 乐团列表
 | 
	
	
		
			
				|  | @@ -56,9 +122,165 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // 获取表演团队和演员
 | 
	
		
			
				|  |  | +    const getUserList = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const { data } = await request.post(
 | 
	
		
			
				|  |  | +          '/api-web/schoolActivity/userList',
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            data: {
 | 
	
		
			
				|  |  | +              activityDetailId: forms.activityDetailId,
 | 
	
		
			
				|  |  | +              musicGroupId: forms.selectOrchestra.musicGroupId,
 | 
	
		
			
				|  |  | +              subjectIds: []
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        const tempData = data || [];
 | 
	
		
			
				|  |  | +        console.log(tempData, 'tempData');
 | 
	
		
			
				|  |  | +        forms.selectOrchestra.subjectAllList = tempData;
 | 
	
		
			
				|  |  | +        forms.selectOrchestra.performerList = tempData;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 添加默认选中的编号
 | 
	
		
			
				|  |  | +        forms.selectOrchestra.subjectIdList = [];
 | 
	
		
			
				|  |  | +        tempData.forEach((item: any) => {
 | 
	
		
			
				|  |  | +          forms.selectOrchestra.subjectIdList.push(item.subjectId);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 添加节目
 | 
	
		
			
				|  |  | +    const onAddItem = () => {
 | 
	
		
			
				|  |  | +      forms.detail.push({ ...detailItem });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 删除节目
 | 
	
		
			
				|  |  | +    const onDelete = (index: number) => {
 | 
	
		
			
				|  |  | +      if (forms.detail.length <= 1) return;
 | 
	
		
			
				|  |  | +      forms.deleteIndex = index;
 | 
	
		
			
				|  |  | +      forms.deleteStatus = true;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 格式化员工数量
 | 
	
		
			
				|  |  | +    const formatterStudents = (list: any) => {
 | 
	
		
			
				|  |  | +      let count = 0;
 | 
	
		
			
				|  |  | +      list.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        count += item.studentCount;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      return count;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 格式化选中的演员
 | 
	
		
			
				|  |  | +    const formatterPerformer = (ids: any[]) => {
 | 
	
		
			
				|  |  | +      const tempList: any = [];
 | 
	
		
			
				|  |  | +      // 先从默认选中的数据中取
 | 
	
		
			
				|  |  | +      forms.selectOrchestra.performerList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        if (ids.includes(item.subjectId)) tempList.push(item);
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      // 在从总的里面取
 | 
	
		
			
				|  |  | +      forms.selectOrchestra.subjectAllList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        const tmpPerformanceIndex =
 | 
	
		
			
				|  |  | +          forms.selectOrchestra.performerList.findIndex(
 | 
	
		
			
				|  |  | +            (p: any) => p.subjectId == item.subjectId
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +        if (ids.includes(item.subjectId) && tmpPerformanceIndex < 0) {
 | 
	
		
			
				|  |  | +          tempList.push(item);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      forms.selectOrchestra.performerList = tempList;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      onMounted(() => {
 | 
	
		
			
				|  |  |        musicGroupPage();
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const checkForms = () => {
 | 
	
		
			
				|  |  | +      if (!forms.name) {
 | 
	
		
			
				|  |  | +        showToast('请填写活动活动名称');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if (forms.name.length < 3 || forms.name.length > 25) {
 | 
	
		
			
				|  |  | +        showToast('活动名称长度3~25');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if (!forms.type) {
 | 
	
		
			
				|  |  | +        showToast('请选择活动类别');
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      for (let i = 0, j = forms.detail.length; i < j; i++) {
 | 
	
		
			
				|  |  | +        const tDetail = forms.detail[i];
 | 
	
		
			
				|  |  | +        if (!tDetail.name) {
 | 
	
		
			
				|  |  | +          showToast('节目名称不能为空');
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!tDetail.type) {
 | 
	
		
			
				|  |  | +          showToast('请选择活动类型');
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!tDetail.musicGroupId) {
 | 
	
		
			
				|  |  | +          showToast('请选择表演乐团');
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (tDetail.subjectIdList.length <= 0) {
 | 
	
		
			
				|  |  | +          showToast('请选择表演团队');
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (formatterStudents(tDetail.performerList) <= 0) {
 | 
	
		
			
				|  |  | +          showToast('请选择演员');
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!tDetail.time) {
 | 
	
		
			
				|  |  | +          showToast('请输入节目时长');
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return true;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const onSubmit = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        // 校验
 | 
	
		
			
				|  |  | +        if (!checkForms()) return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const params = {
 | 
	
		
			
				|  |  | +          startTime: forms.startTime,
 | 
	
		
			
				|  |  | +          endTime: forms.startTime + ' 23:59:59',
 | 
	
		
			
				|  |  | +          name: forms.name,
 | 
	
		
			
				|  |  | +          type: forms.type,
 | 
	
		
			
				|  |  | +          detail: [] as any[]
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        const tempDetail: any[] = [];
 | 
	
		
			
				|  |  | +        forms.detail.forEach((item: any, index: number) => {
 | 
	
		
			
				|  |  | +          tempDetail.push({
 | 
	
		
			
				|  |  | +            sort: index + 1,
 | 
	
		
			
				|  |  | +            name: item.name,
 | 
	
		
			
				|  |  | +            type: item.type,
 | 
	
		
			
				|  |  | +            musicGroupId: item.musicGroupId,
 | 
	
		
			
				|  |  | +            subjectIdList: item.subjectIdList,
 | 
	
		
			
				|  |  | +            studentNum: formatterStudents(item.performerList),
 | 
	
		
			
				|  |  | +            studentList: item.performerList,
 | 
	
		
			
				|  |  | +            time: item.time,
 | 
	
		
			
				|  |  | +            attachmentUrl: [
 | 
	
		
			
				|  |  | +              ...item.attachmentImgUrl,
 | 
	
		
			
				|  |  | +              ...item.attachmentUrl
 | 
	
		
			
				|  |  | +            ].join(',')
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        params.detail = tempDetail;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        await request.post('/api-web/schoolActivity/save', {
 | 
	
		
			
				|  |  | +          hideLoading: false,
 | 
	
		
			
				|  |  | +          data: params
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        router.push('/activity-record');
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |      return () => (
 | 
	
		
			
				|  |  |        <div class={styles.operation}>
 | 
	
		
			
				|  |  |          <MHeader />
 | 
	
	
		
			
				|  | @@ -70,6 +292,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |              inputAlign="right"
 | 
	
		
			
				|  |  |              readonly
 | 
	
		
			
				|  |  |              clearable={false}
 | 
	
		
			
				|  |  | +            v-model={forms.startTime}
 | 
	
		
			
				|  |  |              onClick={() => (forms.timerStatus = true)}
 | 
	
		
			
				|  |  |              placeholder="请选择活动日期"></Field>
 | 
	
		
			
				|  |  |            <Field
 | 
	
	
		
			
				|  | @@ -77,20 +300,16 @@ export default defineComponent({
 | 
	
		
			
				|  |  |              inputAlign="right"
 | 
	
		
			
				|  |  |              placeholder="请填写活动名称"
 | 
	
		
			
				|  |  |              maxlength={25}
 | 
	
		
			
				|  |  | +            v-model={forms.name}
 | 
	
		
			
				|  |  | +            autocomplete="off"
 | 
	
		
			
				|  |  |            />
 | 
	
		
			
				|  |  | -          <Field label="活动名称" labelAlign="top">
 | 
	
		
			
				|  |  | +          <Field label="活动类别" labelAlign="top">
 | 
	
		
			
				|  |  |              {{
 | 
	
		
			
				|  |  |                input: () => (
 | 
	
		
			
				|  |  | -                <RadioGroup
 | 
	
		
			
				|  |  | -                  class={styles.searchTypeFlex}
 | 
	
		
			
				|  |  | -                  v-model={forms.submitEvaluateStatus}>
 | 
	
		
			
				|  |  | +                <RadioGroup class={styles.searchTypeFlex} v-model={forms.type}>
 | 
	
		
			
				|  |  |                    {Object.keys(activityStatus).map((item: string) => (
 | 
	
		
			
				|  |  |                      <Tag
 | 
	
		
			
				|  |  | -                      type={
 | 
	
		
			
				|  |  | -                        forms.submitEvaluateStatus === item
 | 
	
		
			
				|  |  | -                          ? 'primary'
 | 
	
		
			
				|  |  | -                          : 'default'
 | 
	
		
			
				|  |  | -                      }
 | 
	
		
			
				|  |  | +                      type={forms.type === item ? 'primary' : 'default'}
 | 
	
		
			
				|  |  |                        round>
 | 
	
		
			
				|  |  |                        <Radio name={item} />
 | 
	
		
			
				|  |  |                        {activityStatus[item]}
 | 
	
	
		
			
				|  | @@ -102,113 +321,198 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            </Field>
 | 
	
		
			
				|  |  |          </CellGroup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        <CellGroup inset class={styles.topCellGroup}>
 | 
	
		
			
				|  |  | -          <Cell center>
 | 
	
		
			
				|  |  | -            {{
 | 
	
		
			
				|  |  | -              icon: () => <Icon name={iconVideo} class={styles.iconImg} />,
 | 
	
		
			
				|  |  | -              title: () => <div class={styles.topTitle}>节目二</div>,
 | 
	
		
			
				|  |  | -              value: () => <Icon name={iconDelete} class={styles.iconImg} />
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -          </Cell>
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            label="节目名称"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            placeholder="请填写节目名称"
 | 
	
		
			
				|  |  | -            maxlength={25}
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            label="节目类型"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            placeholder="请填写节目"
 | 
	
		
			
				|  |  | -            class={styles.programType}>
 | 
	
		
			
				|  |  | -            {{
 | 
	
		
			
				|  |  | -              input: () => (
 | 
	
		
			
				|  |  | -                <RadioGroup
 | 
	
		
			
				|  |  | -                  class={[styles.searchTypeFlex, styles.small]}
 | 
	
		
			
				|  |  | -                  v-model={forms.programType}>
 | 
	
		
			
				|  |  | -                  {Object.keys(programType).map((item: string) => (
 | 
	
		
			
				|  |  | -                    <Tag
 | 
	
		
			
				|  |  | -                      type={forms.programType === item ? 'primary' : 'default'}
 | 
	
		
			
				|  |  | -                      round>
 | 
	
		
			
				|  |  | -                      <Radio name={item} />
 | 
	
		
			
				|  |  | -                      {programType[item]}
 | 
	
		
			
				|  |  | -                    </Tag>
 | 
	
		
			
				|  |  | -                  ))}
 | 
	
		
			
				|  |  | -                </RadioGroup>
 | 
	
		
			
				|  |  | -              )
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -          </Field>
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            isLink
 | 
	
		
			
				|  |  | -            label="表演乐团"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            readonly
 | 
	
		
			
				|  |  | -            clearable={false}
 | 
	
		
			
				|  |  | -            onClick={() => (forms.orchestraStatus = true)}
 | 
	
		
			
				|  |  | -            placeholder="请选择表演乐团"
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            isLink
 | 
	
		
			
				|  |  | -            label="表演团队"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            readonly
 | 
	
		
			
				|  |  | -            clearable={false}
 | 
	
		
			
				|  |  | -            placeholder="请选择表演团队"
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            isLink
 | 
	
		
			
				|  |  | -            label="演员"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            readonly
 | 
	
		
			
				|  |  | -            clearable={false}
 | 
	
		
			
				|  |  | -            placeholder="请选择演员"
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -          <Field
 | 
	
		
			
				|  |  | -            label="节目时长"
 | 
	
		
			
				|  |  | -            inputAlign="right"
 | 
	
		
			
				|  |  | -            onClick={() => (forms.programTimerStatus = true)}
 | 
	
		
			
				|  |  | -            placeholder="请选择节目时长">
 | 
	
		
			
				|  |  | -            {{
 | 
	
		
			
				|  |  | -              input: () => (
 | 
	
		
			
				|  |  | -                <div class={styles.programTimer}>
 | 
	
		
			
				|  |  | -                  <span>3</span>分<span>24</span>秒
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              )
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -          </Field>
 | 
	
		
			
				|  |  | -          <Field label="上传附件" labelAlign="top">
 | 
	
		
			
				|  |  | -            {{
 | 
	
		
			
				|  |  | -              input: () => (
 | 
	
		
			
				|  |  | -                <MUploader
 | 
	
		
			
				|  |  | -                  uploadIcon={iconUploadImg}
 | 
	
		
			
				|  |  | -                  maxCount={5}
 | 
	
		
			
				|  |  | -                  style={{ marginTop: '4px' }}>
 | 
	
		
			
				|  |  | -                  <MUploaderInside
 | 
	
		
			
				|  |  | -                    uploadIcon={iconUploadVideo}
 | 
	
		
			
				|  |  | -                    uploadType="VIDEO"
 | 
	
		
			
				|  |  | -                    accept=".mp4"
 | 
	
		
			
				|  |  | -                    maxCount={3}
 | 
	
		
			
				|  |  | +        {forms.detail.map((item: any, index: number) => (
 | 
	
		
			
				|  |  | +          <CellGroup inset class={styles.topCellGroup}>
 | 
	
		
			
				|  |  | +            <Cell center>
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                icon: () => <Icon name={iconVideo} class={styles.iconImg} />,
 | 
	
		
			
				|  |  | +                title: () => <div class={styles.topTitle}>节目{index + 1}</div>,
 | 
	
		
			
				|  |  | +                value: () => (
 | 
	
		
			
				|  |  | +                  <Icon
 | 
	
		
			
				|  |  | +                    name={iconDelete}
 | 
	
		
			
				|  |  | +                    class={[
 | 
	
		
			
				|  |  | +                      styles.iconImg,
 | 
	
		
			
				|  |  | +                      forms.detail.length <= 1 ? styles.disabled : ''
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                    onClick={() => onDelete(index)}
 | 
	
		
			
				|  |  |                    />
 | 
	
		
			
				|  |  | -                </MUploader>
 | 
	
		
			
				|  |  | -              )
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -          </Field>
 | 
	
		
			
				|  |  | -        </CellGroup>
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </Cell>
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              label="节目名称"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              placeholder="请填写节目名称"
 | 
	
		
			
				|  |  | +              maxlength={25}
 | 
	
		
			
				|  |  | +              v-model={item.name}
 | 
	
		
			
				|  |  | +              autocomplete="off"
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              label="节目类型"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              placeholder="请填写节目"
 | 
	
		
			
				|  |  | +              class={styles.programType}>
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                input: () => (
 | 
	
		
			
				|  |  | +                  <RadioGroup
 | 
	
		
			
				|  |  | +                    class={[styles.searchTypeFlex, styles.small]}
 | 
	
		
			
				|  |  | +                    v-model={item.type}>
 | 
	
		
			
				|  |  | +                    {Object.keys(programType).map((program: string) => (
 | 
	
		
			
				|  |  | +                      <Tag
 | 
	
		
			
				|  |  | +                        type={item.type === program ? 'primary' : 'default'}
 | 
	
		
			
				|  |  | +                        round>
 | 
	
		
			
				|  |  | +                        <Radio name={program} />
 | 
	
		
			
				|  |  | +                        {programType[program]}
 | 
	
		
			
				|  |  | +                      </Tag>
 | 
	
		
			
				|  |  | +                    ))}
 | 
	
		
			
				|  |  | +                  </RadioGroup>
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </Field>
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              isLink
 | 
	
		
			
				|  |  | +              label="表演乐团"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              readonly
 | 
	
		
			
				|  |  | +              clearable={false}
 | 
	
		
			
				|  |  | +              v-model={item.musicGroupName}
 | 
	
		
			
				|  |  | +              onClick={() => {
 | 
	
		
			
				|  |  | +                forms.orchestraStatus = true;
 | 
	
		
			
				|  |  | +                forms.selectOrchestra = [];
 | 
	
		
			
				|  |  | +                forms.selectOrchestra = item;
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +              placeholder="请选择表演乐团"
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              isLink
 | 
	
		
			
				|  |  | +              label="表演团队"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              readonly
 | 
	
		
			
				|  |  | +              clearable={false}
 | 
	
		
			
				|  |  | +              onClick={() => {
 | 
	
		
			
				|  |  | +                if (!item.musicGroupId) {
 | 
	
		
			
				|  |  | +                  showToast('请选择表演乐团');
 | 
	
		
			
				|  |  | +                  return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                forms.teamStatus = true;
 | 
	
		
			
				|  |  | +                forms.selectOrchestra = [];
 | 
	
		
			
				|  |  | +                forms.selectOrchestra = item;
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +              placeholder={
 | 
	
		
			
				|  |  | +                item.subjectIdList.length > 0 ? '' : '请选择表演乐团'
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              border={item.subjectIdList.length <= 0}
 | 
	
		
			
				|  |  | +              class={item.subjectIdList.length > 0 ? styles.teamCell : ''}
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +            {item.subjectIdList.length > 0 && (
 | 
	
		
			
				|  |  | +              <Cell class={styles.tagCell} center>
 | 
	
		
			
				|  |  | +                {{
 | 
	
		
			
				|  |  | +                  title: () =>
 | 
	
		
			
				|  |  | +                    item.subjectIdList.map(
 | 
	
		
			
				|  |  | +                      (subjectId: [number, string], index: number) => {
 | 
	
		
			
				|  |  | +                        let subjectName = '';
 | 
	
		
			
				|  |  | +                        item.subjectAllList.forEach((subject: any) => {
 | 
	
		
			
				|  |  | +                          if (subject.subjectId === subjectId) {
 | 
	
		
			
				|  |  | +                            subjectName = subject.subjectName;
 | 
	
		
			
				|  |  | +                          }
 | 
	
		
			
				|  |  | +                        });
 | 
	
		
			
				|  |  | +                        return (
 | 
	
		
			
				|  |  | +                          <Tag type="primary" plain class={styles.tagItem}>
 | 
	
		
			
				|  |  | +                            {subjectName}
 | 
	
		
			
				|  |  | +                            <Icon
 | 
	
		
			
				|  |  | +                              name="cross"
 | 
	
		
			
				|  |  | +                              class={styles.closeable}
 | 
	
		
			
				|  |  | +                              onClick={() => {
 | 
	
		
			
				|  |  | +                                item.subjectIdList.splice(index, 1);
 | 
	
		
			
				|  |  | +                                formatterPerformer(item.subjectIdList);
 | 
	
		
			
				|  |  | +                              }}
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                          </Tag>
 | 
	
		
			
				|  |  | +                        );
 | 
	
		
			
				|  |  | +                      }
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                }}
 | 
	
		
			
				|  |  | +              </Cell>
 | 
	
		
			
				|  |  | +            )}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              isLink
 | 
	
		
			
				|  |  | +              label="演员"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              readonly
 | 
	
		
			
				|  |  | +              clearable={false}
 | 
	
		
			
				|  |  | +              onClick={() => {
 | 
	
		
			
				|  |  | +                if (item.subjectIdList.length <= 0) {
 | 
	
		
			
				|  |  | +                  showToast('请选择表演团队');
 | 
	
		
			
				|  |  | +                  return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                forms.castStatus = true;
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +              v-slots={{
 | 
	
		
			
				|  |  | +                input: () =>
 | 
	
		
			
				|  |  | +                  formatterStudents(item.performerList) > 0 ? (
 | 
	
		
			
				|  |  | +                    <div class={styles.performance}>
 | 
	
		
			
				|  |  | +                      共 <span>{formatterStudents(item.performerList)}</span> 名
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : (
 | 
	
		
			
				|  |  | +                    <div class={styles.placeholder}>请选择演员</div>
 | 
	
		
			
				|  |  | +                  )
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +            <Field
 | 
	
		
			
				|  |  | +              label="节目时长"
 | 
	
		
			
				|  |  | +              inputAlign="right"
 | 
	
		
			
				|  |  | +              onClick={() => (forms.programTimerStatus = true)}
 | 
	
		
			
				|  |  | +              center
 | 
	
		
			
				|  |  | +              placeholder="请选择节目时长">
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                input: () => {
 | 
	
		
			
				|  |  | +                  const timers = formatterTimer(item.time);
 | 
	
		
			
				|  |  | +                  return (
 | 
	
		
			
				|  |  | +                    <div class={styles.programTimer}>
 | 
	
		
			
				|  |  | +                      <span>{timers?.minute}</span>分
 | 
	
		
			
				|  |  | +                      <span>{timers?.secord}</span>秒
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  );
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </Field>
 | 
	
		
			
				|  |  | +            <Field label="上传附件" labelAlign="top">
 | 
	
		
			
				|  |  | +              {{
 | 
	
		
			
				|  |  | +                input: () => (
 | 
	
		
			
				|  |  | +                  <MUploader
 | 
	
		
			
				|  |  | +                    uploadIcon={iconUploadImg}
 | 
	
		
			
				|  |  | +                    maxCount={5}
 | 
	
		
			
				|  |  | +                    v-model:modelValue={item.attachmentImgUrl}
 | 
	
		
			
				|  |  | +                    style={{ marginTop: '6px' }}>
 | 
	
		
			
				|  |  | +                    <MUploaderInside
 | 
	
		
			
				|  |  | +                      uploadIcon={iconUploadVideo}
 | 
	
		
			
				|  |  | +                      uploadType="VIDEO"
 | 
	
		
			
				|  |  | +                      accept=".mp4"
 | 
	
		
			
				|  |  | +                      maxCount={3}
 | 
	
		
			
				|  |  | +                      v-model:modelValue={item.attachmentVideoUrl}
 | 
	
		
			
				|  |  | +                    />
 | 
	
		
			
				|  |  | +                  </MUploader>
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            </Field>
 | 
	
		
			
				|  |  | +          </CellGroup>
 | 
	
		
			
				|  |  | +        ))}
 | 
	
		
			
				|  |  |          <div class={styles.addButtonGroup}>
 | 
	
		
			
				|  |  |            <Button
 | 
	
		
			
				|  |  |              icon="plus"
 | 
	
		
			
				|  |  |              block
 | 
	
		
			
				|  |  |              type="primary"
 | 
	
		
			
				|  |  |              plain
 | 
	
		
			
				|  |  | -            class={styles.addButton}>
 | 
	
		
			
				|  |  | +            class={styles.addButton}
 | 
	
		
			
				|  |  | +            onClick={onAddItem}>
 | 
	
		
			
				|  |  |              添加节目
 | 
	
		
			
				|  |  |            </Button>
 | 
	
		
			
				|  |  |          </div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          <MSticky position="bottom">
 | 
	
		
			
				|  |  |            <div class={['btnGroupFixed', styles.bottonGroup]}>
 | 
	
		
			
				|  |  | -            <Button type="primary" round block>
 | 
	
		
			
				|  |  | +            <Button type="primary" round block onClick={onSubmit}>
 | 
	
		
			
				|  |  |                确认
 | 
	
		
			
				|  |  |              </Button>
 | 
	
		
			
				|  |  |            </div>
 | 
	
	
		
			
				|  | @@ -218,8 +522,14 @@ export default defineComponent({
 | 
	
		
			
				|  |  |          <Popup v-model:show={forms.timerStatus} round position="bottom">
 | 
	
		
			
				|  |  |            <DatePicker
 | 
	
		
			
				|  |  |              v-model={forms.currentDate}
 | 
	
		
			
				|  |  | +            minDate={new Date()}
 | 
	
		
			
				|  |  |              formatter={formatterDatePicker}
 | 
	
		
			
				|  |  |              onCancel={() => (forms.timerStatus = false)}
 | 
	
		
			
				|  |  | +            onConfirm={({ selectedValues }) => {
 | 
	
		
			
				|  |  | +              // console.log(val, 12);
 | 
	
		
			
				|  |  | +              forms.startTime = selectedValues.join('-');
 | 
	
		
			
				|  |  | +              forms.timerStatus = false;
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  |            />
 | 
	
		
			
				|  |  |          </Popup>
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -228,6 +538,12 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            <Picker
 | 
	
		
			
				|  |  |              columns={forms.orchestraColumns}
 | 
	
		
			
				|  |  |              onCancel={() => (forms.orchestraStatus = false)}
 | 
	
		
			
				|  |  | +            onConfirm={({ selectedOptions }) => {
 | 
	
		
			
				|  |  | +              forms.selectOrchestra.musicGroupName = selectedOptions[0].text;
 | 
	
		
			
				|  |  | +              forms.selectOrchestra.musicGroupId = selectedOptions[0].value;
 | 
	
		
			
				|  |  | +              forms.orchestraStatus = false;
 | 
	
		
			
				|  |  | +              getUserList();
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  |            />
 | 
	
		
			
				|  |  |          </Popup>
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -236,8 +552,82 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            v-model:show={forms.programTimerStatus}
 | 
	
		
			
				|  |  |            round
 | 
	
		
			
				|  |  |            style={{ width: '82%' }}>
 | 
	
		
			
				|  |  | -          <InputTimer />
 | 
	
		
			
				|  |  | +          <InputTimer
 | 
	
		
			
				|  |  | +            show={forms.programTimerStatus}
 | 
	
		
			
				|  |  | +            time={forms.selectOrchestra.time}
 | 
	
		
			
				|  |  | +            onClose={() => (forms.programTimerStatus = false)}
 | 
	
		
			
				|  |  | +            onConfirm={(val: any) => {
 | 
	
		
			
				|  |  | +              const secords =
 | 
	
		
			
				|  |  | +                Number(val.minute || 0) * 60 + Number(val.second || 0);
 | 
	
		
			
				|  |  | +              forms.selectOrchestra.time = secords;
 | 
	
		
			
				|  |  | +              forms.programTimerStatus = false;
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {/* 删除节目提示 */}
 | 
	
		
			
				|  |  | +        <Popup v-model:show={forms.deleteStatus} round style={{ width: '82%' }}>
 | 
	
		
			
				|  |  | +          <div class={styles.popupContainer}>
 | 
	
		
			
				|  |  | +            <h2 class={styles.popupTitle}>删除节目</h2>
 | 
	
		
			
				|  |  | +            <div class={styles.popupContent}>
 | 
	
		
			
				|  |  | +              <p class={styles.tipContent}>
 | 
	
		
			
				|  |  | +                删除<span>《节目{forms.deleteIndex + 1}》</span>
 | 
	
		
			
				|  |  | +                ,删除后内容不可恢复
 | 
	
		
			
				|  |  | +              </p>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <div class={['btnGroupPopup']}>
 | 
	
		
			
				|  |  | +              <Button
 | 
	
		
			
				|  |  | +                type="primary"
 | 
	
		
			
				|  |  | +                round
 | 
	
		
			
				|  |  | +                onClick={() => {
 | 
	
		
			
				|  |  | +                  forms.detail.splice(forms.deleteIndex, 1);
 | 
	
		
			
				|  |  | +                  forms.deleteStatus = false;
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                确定
 | 
	
		
			
				|  |  | +              </Button>
 | 
	
		
			
				|  |  | +              <Button round onClick={() => (forms.deleteStatus = false)}>
 | 
	
		
			
				|  |  | +                取消
 | 
	
		
			
				|  |  | +              </Button>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {/* 表演团队 */}
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          v-model:show={forms.teamStatus}
 | 
	
		
			
				|  |  | +          round
 | 
	
		
			
				|  |  | +          position="bottom"
 | 
	
		
			
				|  |  | +          closeable>
 | 
	
		
			
				|  |  | +          <PerformanceTeam
 | 
	
		
			
				|  |  | +            show={forms.teamStatus}
 | 
	
		
			
				|  |  | +            performances={forms.selectOrchestra.subjectAllList}
 | 
	
		
			
				|  |  | +            selectIds={forms.selectOrchestra.subjectIdList}
 | 
	
		
			
				|  |  | +            onClose={() => (forms.teamStatus = false)}
 | 
	
		
			
				|  |  | +            onConfirm={(ids: any[]) => {
 | 
	
		
			
				|  |  | +              forms.selectOrchestra.subjectIdList = ids;
 | 
	
		
			
				|  |  | +              formatterPerformer(ids);
 | 
	
		
			
				|  |  | +              forms.teamStatus = false;
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  |          </Popup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {/* 演员名单 */}
 | 
	
		
			
				|  |  | +        <MPopup v-model:modelValue={forms.castStatus}>
 | 
	
		
			
				|  |  | +          <CastModal
 | 
	
		
			
				|  |  | +            subjectAllList={forms.selectOrchestra.subjectAllList}
 | 
	
		
			
				|  |  | +            v-model:performerList={forms.selectOrchestra.performerList}
 | 
	
		
			
				|  |  | +            onClose={() => (forms.castStatus = false)}
 | 
	
		
			
				|  |  | +            onConfirm={(val: any) => {
 | 
	
		
			
				|  |  | +              const subjects = val || [];
 | 
	
		
			
				|  |  | +              // 选中的声部编号
 | 
	
		
			
				|  |  | +              const ids: any = [];
 | 
	
		
			
				|  |  | +              subjects.forEach((subject: any) => {
 | 
	
		
			
				|  |  | +                ids.push(subject.subjectId);
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +              forms.selectOrchestra.subjectIdList = ids || [];
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </MPopup>
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |    }
 |