| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- import SaveForm from '@/components/save-form'
- import Pagination from '@/components/pagination'
- import {
- DataTableColumn,
- NButton,
- NCascader,
- NCol,
- NDataTable,
- NDatePicker,
- NFormItem,
- NInput,
- NModal,
- NRow,
- NSelect,
- NSpace,
- NTag,
- NTooltip,
- useDialog,
- useMessage,
- NEmpty,
- NIcon
- } from 'naive-ui'
- import { defineComponent, inject, onMounted, reactive, ref, provide, nextTick } from 'vue'
- import { InternalRowData } from 'naive-ui/es/data-table/src/interface'
- import { lessonType, getLessonType } from '@/views/knowledge-manage/knowledgeTypeData'
- import { fetchCategoryList } from '@/views/educational-manage/api'
- import {
- lessonTrainingDetailBatchInsert,
- lessonTrainingDetailMaterialPage
- } from '@/views/teaching-manage/api'
- import { fetchKnowledgeList } from '@/views/knowledge-manage/api'
- const classType: { [_: string]: any } = {
- VIDEO: '视频',
- IMG: '视频',
- SONG: '曲目'
- }
- export default defineComponent({
- name: 'addMaterialTraining',
- props: {
- parentData: {
- type: Object,
- default: () => {}
- }
- },
- emits: ['close', 'handleSuccess'],
- setup(props, { emit }) {
- console.log('🚀 ~ props', props.parentData.id)
- const dialog = useDialog()
- const message = useMessage()
- const state = reactive({
- loading: false,
- saveLoading: false,
- pagination: {
- page: 1,
- rows: 10,
- pageTotal: 10
- },
- dataList: [] as any,
- checkList: [] as string[],
- selectCheckList: [] as any
- })
- const searchForm = reactive({
- keyword: '',
- // materialCategoryId: null
- knowledgePointIds: null
- })
- // 获取分类列表
- // const category = reactive({
- // list: [] as any,
- // index: -1,
- // loading: false
- // })
- // const getCategoryList = async () => {
- // category.loading = true
- // try {
- // const { data } = await fetchCategoryList({ page: 1 })
- // category.list = data?.rows || []
- // } catch {}
- // category.loading = false
- // }
- // 知识点列表
- const knowledge = reactive({
- list: [] as any,
- index: -1,
- loading: false
- })
- const getKnowledgeList = async () => {
- try {
- const { data } = await fetchKnowledgeList({
- courseTypeCode: props.parentData.courseTypeCode,
- page: 1,
- rows: 1000
- })
- console.log(data)
- const tempList = data.rows || []
- // if (!searchForm.knowledgePointId) {
- // searchForm.knowledgePointId = tempList.length > 0 ? tempList[0].id : null
- // }
- knowledge.list = tempList
- } catch {}
- }
- const columns = (): DataTableColumn[] => {
- return [
- {
- type: 'selection',
- disabled(row) {
- return row.knowledgePointId ? false : true
- }
- },
- {
- title: '素材名称',
- key: 'materialName',
- fixed: 'left'
- },
- {
- title: '素材类型',
- key: 'materialCategoryName',
- render(row) {
- return classType[row.type as any]
- }
- },
- {
- title: '分段编号',
- key: 'sn'
- },
- {
- title: '课程类型',
- key: 'courseTypeName',
- width: 200,
- ellipsis: true,
- render(row: InternalRowData) {
- return (
- <NTooltip placement="left-start">
- {{
- default: () => row.courseTypeName,
- trigger: () => row.courseTypeName
- }}
- </NTooltip>
- )
- }
- },
- {
- title: '知识点分类',
- key: 'knowledgePointName'
- }
- ]
- }
- const saveForm = ref()
- const onSubmit = () => {
- state.pagination.page = 1
- getList()
- }
- const onSearch = () => {
- saveForm.value?.submit()
- }
- const onBtnReset = () => {
- // saveForm.value?.reset()
- // 默认选中第一个
- searchForm.knowledgePointIds = null
- searchForm.keyword = ''
- onSearch()
- }
- const getList = async () => {
- try {
- state.loading = true
- const tranbody = {
- lessonTrainingId: props.parentData.id,
- ...searchForm,
- courseTypeCode: props.parentData.courseTypeCode,
- page: state.pagination.page,
- rows: state.pagination.rows,
- knowledgePointId: null
- }
- const { data } = await lessonTrainingDetailMaterialPage(tranbody)
- state.loading = false
- state.pagination.pageTotal = Number(data.total)
- // state.dataList = data.rows || []
- const tempRows = data.rows || []
- tempRows.forEach((row: any) => {
- row.tempIndex = new Date().getTime() + '' + Math.random()
- // state.dataList.push({
- // ...row
- // })
- })
- console.log(tempRows, 'rows')
- state.dataList = tempRows
- } catch {
- state.loading = false
- }
- }
- onMounted(async () => {
- await getKnowledgeList()
- // getCategoryList()
- nextTick(async () => {
- await getList()
- })
- })
- // 素材关联知识点
- const handleSave = async () => {
- state.saveLoading = true
- const list = state.checkList.map((n: any) => {
- const item = state.selectCheckList.find((item: any) => item.tempIndex === n)
- return {
- materialId: item.materialId,
- knowledgePointId: item.knowledgePointId,
- lessonTrainingId: props.parentData.id
- }
- })
- try {
- const res: any = await lessonTrainingDetailBatchInsert(list)
- message.success('保存成功')
- emit('handleSuccess')
- } catch (error) {}
- state.saveLoading = false
- }
- return () => (
- <>
- <SaveForm
- style={{ padding: 0, boxShadow: 'none' }}
- ref={saveForm}
- label-width=""
- model={searchForm}
- onSubmit={onSubmit}
- onSetModel={(val: any) => Object.assign(searchForm, val)}
- saveKey="addMaterialTraining-abc-key-class"
- >
- <NFormItem label="知识点分类" path="knowledgePointIds">
- <NCascader
- v-model:value={searchForm.knowledgePointIds}
- options={knowledge.list}
- multiple
- clearable
- filterable
- childrenField="children"
- expandTrigger="hover"
- valueField="id"
- labelField="name"
- checkStrategy="all"
- cascade
- showPath
- maxTagCount={'responsive'}
- v-slots={{
- empty: () =>
- knowledge.loading ? (
- <>
- <NEmpty
- description="加载中"
- v-slots={{
- icon: () => (
- <NIcon size="30">
- <svg
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- viewBox="0 0 1024 1024"
- >
- <path
- d="M988 548c-19.9 0-36-16.1-36-36c0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 0 0-94.3-139.9a437.71 437.71 0 0 0-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7c26.7 63.1 40.2 130.2 40.2 199.3c.1 19.9-16 36-35.9 36z"
- fill="currentColor"
- ></path>
- </svg>
- </NIcon>
- )
- }}
- ></NEmpty>
- </>
- ) : null
- }}
- />
- </NFormItem>
- <NFormItem label="素材名称/编号" path="keyword">
- <NInput
- v-model:value={searchForm.keyword}
- onKeydown={(e) => {
- if (e.code === 'Enter') {
- onSubmit()
- }
- }}
- clearable
- />
- </NFormItem>
- <NFormItem>
- <NSpace>
- <NButton type="primary" onClick={onSearch}>
- 搜索
- </NButton>
- <NButton type="default" onClick={onBtnReset}>
- 重置
- </NButton>
- </NSpace>
- </NFormItem>
- </SaveForm>
- <NDataTable
- loading={state.loading}
- maxHeight="calc(100vh - 270px)"
- rowKey={(row: any) => row.tempIndex}
- columns={columns()}
- data={state.dataList}
- v-model:checkedRowKeys={state.checkList}
- onUpdate:checkedRowKeys={(keys: any, rows: any, meta: any) => {
- // state.selectCheckList
- // 处理删除的数据
- const tempList: any = []
- state.selectCheckList.forEach((item: any) => {
- if (state.checkList.includes(item.tempIndex)) {
- tempList.push(item)
- }
- })
- // 添加新增的数据
- state.checkList.forEach((key: string) => {
- const item = state.dataList.find((item: any) => item.tempIndex === key)
- const index = state.selectCheckList.findIndex((item: any) => item.tempIndex === key)
- if (index <= -1) {
- tempList.push(item)
- }
- })
- state.selectCheckList = [...tempList]
- }}
- ></NDataTable>
- <Pagination
- v-model:page={state.pagination.page}
- v-model:pageTotal={state.pagination.pageTotal}
- v-model:pageSize={state.pagination.rows}
- onList={getList}
- sync
- saveKey="addMaterialTraining-abc-key-class"
- ></Pagination>
- <NButton
- type="primary"
- disabled={state.checkList.length ? false : true}
- loading={state.saveLoading}
- onClick={() => handleSave()}
- >
- 确认
- </NButton>
- </>
- )
- }
- })
|