|
|
@@ -25,7 +25,7 @@
|
|
|
>
|
|
|
<NSpace class="pb-4">
|
|
|
<n-input-group @keyup.enter="getData">
|
|
|
- <n-input clearable v-model:value="search"/>
|
|
|
+ <n-input clearable v-model:value="search" />
|
|
|
<n-button type="primary" ghost @click="getData(true)"> 搜索 </n-button>
|
|
|
</n-input-group>
|
|
|
<NButton type="primary" @click="onCreate">创建</NButton>
|
|
|
@@ -65,45 +65,72 @@
|
|
|
role="dialog"
|
|
|
aria-modal="true"
|
|
|
>
|
|
|
- <NForm ref="form" :model="model" :rules="rules">
|
|
|
- <div class="flex">
|
|
|
- <div class="flex-1">
|
|
|
- <NFormItem label="专业" path="major">
|
|
|
- <NInput v-model:value="model.major" />
|
|
|
- </NFormItem>
|
|
|
- <NFormItem label="标题" path="title">
|
|
|
- <NInput v-model:value="model.title" />
|
|
|
- </NFormItem>
|
|
|
- <NFormItem label="描述" path="description">
|
|
|
- <NInput type="textarea" v-model:value="model.description" :resizable="false" :rows="10" />
|
|
|
- </NFormItem>
|
|
|
- <NFormItem label="备注" path="remark">
|
|
|
- <NInput v-model:value="model.remark" />
|
|
|
- </NFormItem>
|
|
|
- </div>
|
|
|
- <div class="flex-1 ml-4">
|
|
|
- <NFormItem label="大纲" path="chapters">
|
|
|
- <div class="w-full">
|
|
|
- <OutlineEditor v-model="model.chapters" />
|
|
|
- <div class="flex mt-1 items-center">
|
|
|
- <NButton
|
|
|
- size="small"
|
|
|
- quaternary
|
|
|
- type="primary"
|
|
|
- :loading="genChaptering"
|
|
|
- @click="genChapters"
|
|
|
- >生成大纲</NButton
|
|
|
- >
|
|
|
- <div class="flex-1 text-sm text-right">Tab / Shift + Tab 切换级别</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </NFormItem>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <NForm class="edit-form" ref="form" :model="model" :rules="rules" inline>
|
|
|
+ <!-- 订单号 总价 定金 定金交付 尾款 尾款交付 交稿状态 接单渠道 学历 专业 题目 字数(k) 查重要求 截稿日期 稿费结款方式 是否结稿费 备注 -->
|
|
|
+
|
|
|
+ <NFormItem label="订单号" path="orderNumber">
|
|
|
+ <NInput v-model:value="model.orderNumber" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="总价" path="totalPrice">
|
|
|
+ <NInput v-model:value="model.totalPrice" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="定金" path="deposit">
|
|
|
+ <NInput v-model:value="model.deposit" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="定金交付" path="depositPaid">
|
|
|
+ <NCheckbox v-model:checked="model.depositPaid">已交</NCheckbox>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="尾款" path="finalPayment">
|
|
|
+ <NInput v-model:value="model.finalPayment" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="尾款交付" path="finalPaymentPaid">
|
|
|
+ <NCheckbox v-model:checked="model.finalPaymentPaid">已交</NCheckbox>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="交稿状态" path="deliveryStatus">
|
|
|
+ <NSelect v-model:value="model.deliveryStatus" :options="deliveryStatusOptions" filterable />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="接单渠道" path="orderChannel">
|
|
|
+ <NInput v-model:value="model.orderChannel" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="学历" path="education">
|
|
|
+ <NSelect v-model:value="model.education" :options="educationOptions" filterable />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="专业" path="major">
|
|
|
+ <NInput v-model:value="model.major" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="标题" path="title">
|
|
|
+ <NInput v-model:value="model.title" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="字数" path="wordCount">
|
|
|
+ <NInput v-model:value="model.wordCount" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="查重要求" path="plagiarismCheck">
|
|
|
+ <NInput v-model:value="model.plagiarismCheck" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="截稿日期" path="deadline">
|
|
|
+ <NDatePicker
|
|
|
+ v-model:formatted-value="model.deadline"
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ type="date"
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="稿费结款方式" path="paymentMethod">
|
|
|
+ <NInput v-model:value="model.paymentMethod" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="是否结稿费" path="paymentStatus">
|
|
|
+ <NInput v-model:value="model.paymentStatus" />
|
|
|
+ </NFormItem>
|
|
|
+ <div class="w-3/4"></div>
|
|
|
+ <NFormItem style="width: calc(100% - 18px)" label="备注" path="remark">
|
|
|
+ <NInput type="textarea" :resizable="false" :rows="3" v-model:value="model.remark" />
|
|
|
+ </NFormItem>
|
|
|
</NForm>
|
|
|
<NSpace class="text-right" justify="end">
|
|
|
<NButton @click="() => (showForm = false)">取消</NButton>
|
|
|
- <NButton type="primary" @click="submit" :loading="loading">{{ orderId ? '保存' : '创建' }}</NButton>
|
|
|
+ <NButton type="primary" @click="submit(false)" :loading="loading">{{
|
|
|
+ orderId ? '保存' : '创建'
|
|
|
+ }}</NButton>
|
|
|
</NSpace>
|
|
|
</n-card>
|
|
|
</n-modal>
|
|
|
@@ -123,6 +150,37 @@
|
|
|
</div>
|
|
|
</n-drawer-content>
|
|
|
</n-drawer>
|
|
|
+
|
|
|
+ <n-modal v-model:show="showGenDialog">
|
|
|
+ <n-card style="width: 800px" title="生成" :bordered="false" size="huge" role="dialog" aria-modal="true">
|
|
|
+ <NForm ref="genForm" :model="model" :rules="rules">
|
|
|
+ <NFormItem label="描述" path="description">
|
|
|
+ <NInput type="textarea" v-model:value="model.description" :resizable="false" :rows="3" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="大纲" path="chapters">
|
|
|
+ <div class="w-full">
|
|
|
+ <OutlineEditor v-model="model.chapters" />
|
|
|
+ <div class="flex mt-1 items-center">
|
|
|
+ <NButton
|
|
|
+ size="small"
|
|
|
+ quaternary
|
|
|
+ type="primary"
|
|
|
+ :loading="genChaptering"
|
|
|
+ @click="genChapters"
|
|
|
+ >
|
|
|
+ 生成大纲
|
|
|
+ </NButton>
|
|
|
+ <div class="flex-1 text-sm text-right">Tab / Shift + Tab 切换级别</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </NFormItem>
|
|
|
+ </NForm>
|
|
|
+ <NSpace class="text-right" justify="end">
|
|
|
+ <NButton @click="() => (showGenDialog = false)">取消</NButton>
|
|
|
+ <NButton type="primary" @click="gen" :loading="loading">确认生成</NButton>
|
|
|
+ </NSpace>
|
|
|
+ </n-card>
|
|
|
+ </n-modal>
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
import { h, defineComponent, ref, reactive, onMounted, Ref, computed } from 'vue'
|
|
|
@@ -149,7 +207,11 @@ import {
|
|
|
NDropdown,
|
|
|
NDrawer,
|
|
|
NDrawerContent,
|
|
|
- NInputGroup
|
|
|
+ NInputGroup,
|
|
|
+ NSelect,
|
|
|
+ NCheckbox,
|
|
|
+ NRadio,
|
|
|
+ NDatePicker
|
|
|
} from 'naive-ui'
|
|
|
import {
|
|
|
fetchPaperOrders,
|
|
|
@@ -186,6 +248,70 @@ const isLogin = computed(() => {
|
|
|
const roles = computed(() => {
|
|
|
return userInfo.value?.roles || []
|
|
|
})
|
|
|
+const deliveryStatusOptions = [
|
|
|
+ {
|
|
|
+ label: '已交开题',
|
|
|
+ value: '已交开题'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '修改开题中',
|
|
|
+ value: '修改开题中'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '开题定稿',
|
|
|
+ value: '开题定稿'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '已交任务书',
|
|
|
+ value: '已交任务书'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '修改任务书中',
|
|
|
+ value: '修改任务书中'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '任务书定稿',
|
|
|
+ value: '任务书定稿'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '已交初稿',
|
|
|
+ value: '已交初稿'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '改稿中',
|
|
|
+ value: '改稿中'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '定稿',
|
|
|
+ value: '定稿'
|
|
|
+ }
|
|
|
+]
|
|
|
+const educationOptions = [
|
|
|
+ {
|
|
|
+ label: '专科',
|
|
|
+ value: '专科'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '本科',
|
|
|
+ value: '本科'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '专升本',
|
|
|
+ value: '专升本'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '成人本科',
|
|
|
+ value: '成人本科'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '硕士',
|
|
|
+ value: '硕士'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '在职硕士',
|
|
|
+ value: '在职硕士'
|
|
|
+ }
|
|
|
+]
|
|
|
onMounted(() => {
|
|
|
getData()
|
|
|
if (!isLogin.value) {
|
|
|
@@ -272,7 +398,17 @@ const columns: DataTableColumn[] = [
|
|
|
{
|
|
|
type: 'primary',
|
|
|
size: 'small',
|
|
|
- onClick: () => gen(row)
|
|
|
+ onClick: () => {
|
|
|
+ model.value = {
|
|
|
+ major: row.major,
|
|
|
+ title: row.title,
|
|
|
+ description: row.description,
|
|
|
+ remark: row.remark,
|
|
|
+ chapters: row.chapters || []
|
|
|
+ }
|
|
|
+ orderId.value = row.id
|
|
|
+ showGenDialog.value = true
|
|
|
+ }
|
|
|
},
|
|
|
() => '生成'
|
|
|
)
|
|
|
@@ -345,17 +481,20 @@ async function getData(reset = false) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-async function gen(row: any) {
|
|
|
+async function gen() {
|
|
|
+ await genForm.value?.validate()
|
|
|
const d = dialog.success({
|
|
|
title: '生成',
|
|
|
content: '确认开始生成吗?',
|
|
|
positiveText: '确认',
|
|
|
negativeText: '取消',
|
|
|
- onPositiveClick: () => {
|
|
|
+ onPositiveClick: async () => {
|
|
|
d.loading = true
|
|
|
- return fetchGenPaper(row.id)
|
|
|
+ await submit(true)
|
|
|
+ return fetchGenPaper(orderId.value)
|
|
|
.then(() => {
|
|
|
message.success('已开始生成')
|
|
|
+ showGenDialog.value = false
|
|
|
getData()
|
|
|
})
|
|
|
.catch((e: any) => {
|
|
|
@@ -477,9 +616,10 @@ const resultColumns: DataTableColumn[] = [
|
|
|
}
|
|
|
]
|
|
|
|
|
|
-const showForm = ref(false)
|
|
|
+const showForm = ref(true)
|
|
|
+const genForm: Ref<FormInst | null> = ref(null)
|
|
|
const form: Ref<FormInst | null> = ref(null)
|
|
|
-const model = ref({
|
|
|
+const model: Ref<any> = ref({
|
|
|
major: '',
|
|
|
title: '',
|
|
|
description: '',
|
|
|
@@ -491,6 +631,7 @@ const rules = {
|
|
|
title: [{ required: true, message: '请输入标题' }],
|
|
|
description: [{ required: true, message: '请输入描述' }]
|
|
|
}
|
|
|
+const showGenDialog = ref(false)
|
|
|
const loading = ref(false)
|
|
|
function onCreate() {
|
|
|
if (roles.value.includes('paperGen') || roles.value.includes('paperOrder')) {
|
|
|
@@ -516,11 +657,11 @@ function onCreate() {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
-async function submit() {
|
|
|
- try {
|
|
|
+async function submit(gen = false) {
|
|
|
+ if (gen) {
|
|
|
+ await genForm.value?.validate()
|
|
|
+ } else {
|
|
|
await form.value?.validate()
|
|
|
- } catch (e: any) {
|
|
|
- return
|
|
|
}
|
|
|
try {
|
|
|
loading.value = true
|
|
|
@@ -693,3 +834,11 @@ async function genChapters() {
|
|
|
genChaptering.value = false
|
|
|
}
|
|
|
</script>
|
|
|
+<style lang="less" scoped>
|
|
|
+:deep(.edit-form) {
|
|
|
+ flex-wrap: wrap;
|
|
|
+ .n-form-item {
|
|
|
+ width: calc(33.33% - 18px);
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|