新增合同打印功能

This commit is contained in:
hupeng 2024-09-12 18:19:35 +08:00
parent 63f406d6ac
commit 8b35e40094
5 changed files with 460 additions and 6 deletions

View File

@ -62,15 +62,16 @@
"url": "^0.11.3",
"video.js": "^7.21.5",
"vue": "3.4.21",
"vue-baidu-map-3x": "^1.0.34",
"vue-dompurify-html": "^4.1.4",
"vue-i18n": "9.10.2",
"vue-router": "^4.3.0",
"vue-types": "^5.1.1",
"vue-ueditor-wrap": "^3.0.8",
"vue3-print-nb": "^0.1.4",
"vuedraggable": "^4.1.0",
"web-storage-cache": "^1.1.1",
"xml-js": "^1.6.11",
"vue-ueditor-wrap": "^3.0.8",
"vue-baidu-map-3x": "^1.0.34"
"xml-js": "^1.6.11"
},
"devDependencies": {
"@commitlint/cli": "^19.0.1",
@ -85,8 +86,8 @@
"@types/qs": "^6.9.12",
"@typescript-eslint/eslint-plugin": "^7.1.0",
"@typescript-eslint/parser": "^7.1.0",
"@unocss/transformer-variant-group": "^0.58.5",
"@unocss/eslint-config": "^0.57.4",
"@unocss/transformer-variant-group": "^0.58.5",
"@vitejs/plugin-legacy": "^5.3.1",
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue-jsx": "^3.1.0",

View File

@ -134,6 +134,9 @@ dependencies:
vue-ueditor-wrap:
specifier: ^3.0.8
version: 3.0.8(vue@3.4.21)
vue3-print-nb:
specifier: ^0.1.4
version: 0.1.4(typescript@5.3.3)
vuedraggable:
specifier: ^4.1.0
version: 4.1.0(vue@3.4.21)
@ -9412,6 +9415,14 @@ packages:
vue: 3.4.21(typescript@5.3.3)
dev: false
/vue3-print-nb@0.1.4(typescript@5.3.3):
resolution: {integrity: sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==}
dependencies:
vue: 3.4.21(typescript@5.3.3)
transitivePeerDependencies:
- typescript
dev: false
/vue@3.4.21(typescript@5.3.3):
resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==}
peerDependencies:

View File

@ -43,10 +43,13 @@ import VueUeditorWrap from 'vue-ueditor-wrap'
import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患
import print from 'vue3-print-nb'
// 创建实例
const setupAll = async () => {
const app = createApp(App)
app.use(VueUeditorWrap)
app.use(print)
await setupI18n(app)

View File

@ -0,0 +1,415 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="800">
<div id="printMe">
<table border="0" cellspacing="10" width="700" >
<tbody>
<tr>
<td width="743" valign="center" colspan="8" >
<p style="text-align:center;vertical-align:middle;">
<b><span style="color:#0070C0;font-size:18pt;"> &nbsp;&nbsp;&nbsp;</span></b>
<br/>
<b><span style="color:#0070C0;font-size:16pt;">{{formData.name}}</span></b>
</p>
</td>
</tr>
<tr>
<td valign="center" colspan="5" >
<p style="vertical-align:middle;">
<b>&nbsp;合同编号{{formData.number}} </b>
</p>
</td>
<td >
<p style="vertical-align:middle;">
<b>下单日期</b>
</p>
</td>
<td colspan="2" >
<p style="vertical-align:middle;">
<b>{{formatDate(formData.orderTime)}}</b>
</p>
</td>
</tr>
<tr>
<td class="tdborder">
<p class="tdtext" >
<b>客户名称</b>
</p>
</td>
<td valign="center" colspan="3" class="tdborder">
<p class="tdtext" >
{{formData.customerName}}
</p>
</td>
<td valign="center" class="tdborder">
<p class="tdtext">
<b>联系人</b>
</p>
</td>
<td colspan="3" class="tdborder">
<p class="tdtext" >
</p>
</td>
</tr>
<tr>
<td class="tdborder">
<p class="tdtext">
<b>项目经理</b>
</p>
</td>
<td colspan="3" class="tdborder" >
<p class="tdtext" >
</p>
</td>
<td class="tdborder">
<p class="tdtext" >
<b>签单人</b>
</p>
</td>
<td colspan="3" class="tdborder">
<p class="tdtext" >
{{formData.orderAdminName}}
</p>
</td>
</tr>
<tr>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>开始日期</b></p>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
{{formatDate(formData.startTime)}}
</p>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>结束日期</b></p>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
{{formatDate(formData.endTime)}}
</p>
</td>
</tr>
<tr>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>合同金额</b></p>
</td>
<td colspan="2" class="tdborder">
<b><span style="color:#0070C0;font-size:16pt;">{{formData.money}}</span></b>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>已收款</b></p>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
{{formData.returnMoney}}
</p>
</td>
</tr>
<tr>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>备注</b>
</p>
</td>
<td colspan="6" class="tdborder">
<p class="tdtext" >
{{formData.remark}}
</p>
</td>
</tr>
<tr>
<td valign="center" :rowspan="rowspan" class="tdborder" >
<p >
<b>
<div style="width: 20px;margin-left: 15px;">购买产品或服务</div>
</b>
</p>
</td>
<td class="tdborder title">
<b>名称</b>
</td>
<td class="tdborder title" >
<b>数量</b>
</td>
<td class="tdborder title" >
<b>商品属性</b>
</td>
<td class="tdborder title">
<b>单价</b>
</td>
<td class="tdborder title">
<b>小计</b>
</td>
<td class="tdborder title">
<b>备注</b>
</td>
</tr>
<tr v-for="(item,index) in contactsProducts" :key="index">
<td class="tdborder" >
<p>
<b>{{item.name}}</b>
</p>
</td>
<td class="tdborder pcontent">
{{item.nums}}
</td>
<td class="tdborder pcontent">
{{item.sku}}
</td>
<td class="tdborder pcontent">
{{item.price}}
</td>
<td class="tdborder pcontent">
{{item.subtotal}}
</td>
<td class="tdborder pcontent">
{{item.remarks}}
</td>
</tr>
<tr>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>产品金额</b></p>
</td>
<td colspan="2" class="tdborder">
<b><span style="">{{totalPrice}}</span></b>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
<b>折扣</b></p>
</td>
<td colspan="2" class="tdborder">
<p class="tdtext" >
{{discountPrice}}
</p>
</td>
</tr>
<tr>
<td colspan="4" >
<p style="text-align:left;vertical-align:middle;">
<b><span style="font-size:14pt;">甲方</span></b>
<br/>
<br/>
<b><span >盖章签名_____________</span></b>
<br/>
<br/>
<b><span >日期</span></b>
</p>
</td>
<td colspan="4" >
<p style="text-align:left;vertical-align:middle;">
<b><span style="font-size:14pt;">乙方</span></b>
<br/>
<br/>
<b><span >盖章签名_____________</span></b>
<br/>
<br/>
<b><span >日期"</span></b>
</p>
</td>
</tr>
</tbody>
</table>
<br/>
<br/>
<br/>
</div>
<button v-print="'#printMe'">打印合同</button>
</Dialog>
</template>
<script setup lang="ts">
import { ContractApi, ContractVO } from '@/api/crm/crmcontract'
import { useUserStore } from '@/store/modules/user'
import { formatDate } from '@/utils/formatTime'
import print from 'vue3-print-nb'
const userStore = useUserStore()
directives: {
print
}
/** 合同 表单 */
defineOptions({ name: 'ContractPrint' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('打印') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
customerId: undefined,
businessId: undefined,
contactsId: undefined,
sourceId: undefined,
name: undefined,
number: undefined,
orderTime: undefined,
money: undefined,
totalPrice: undefined,
returnMoney: undefined,
discountRate: undefined,
checkStatus: undefined,
flowId: undefined,
stepId: undefined,
checkAdminId: undefined,
flowAdminId: undefined,
startTime: undefined,
endTime: undefined,
orderAdminId: undefined,
remark: undefined,
ownerUserId: undefined,
nextTime: undefined,
expireHandle: undefined,
invoiceMoney: undefined
})
const formRef = ref() // Ref
const contactsProducts = ref([])
const rowspan = ref(2)
/** 打开弹窗 */
const open = async (data) => {
dialogVisible.value = true
resetForm()
formData.value = data
console.log('formData.value :',formData.value )
const list = await ContractApi.getContractProductListByContractId(data.id)
contactsProducts.value = list
rowspan.value = list.length + 1
}
defineExpose({ open }) // open
const totalPrice = computed(() => {
let money = 0
contactsProducts.value.forEach(element => {
money = money + element.subtotal
})
return money
})
const discountPrice = computed(() => {
let money = 0
contactsProducts.value.forEach(element => {
money = money + element.discount
})
return money
})
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
customerId: undefined,
businessId: undefined,
contactsId: undefined,
sourceId: undefined,
name: undefined,
number: undefined,
orderTime: undefined,
money: undefined,
totalPrice: 0,
returnMoney: undefined,
discountRate: 0,
checkStatus: undefined,
flowId: undefined,
stepId: undefined,
checkAdminId: undefined,
flowAdminId: undefined,
startTime: Date.parse(new Date()),
endTime: undefined,
orderAdminId: undefined,
remark: undefined,
ownerUserId: undefined,
nextTime: undefined,
expireHandle: undefined,
invoiceMoney: undefined
}
formRef.value?.resetFields()
}
</script>
<style scope>
table {
border-collapse: collapse;
}
td {
padding: 10px 5px;
}
p {
margin: 0 0 0px;
}
table{
border-spacing: 1px;
}
.tdborder{
border:1px solid #000000;
align-items:center;line-height:16px;
}
.tdtext{
text-align:center;
vertical-align:middle;
}
.title{
padding: 0px;
font-weight: bold;
text-align: center;
}
.pcontent{
padding: 0px;
text-align: center;
}
</style>

View File

@ -94,13 +94,21 @@
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="openPrint"
:disabled = "isDisabled"
>
<Icon icon="ep:printer" class="mr-5px" /> 打印
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" highlight-current-row @current-change="handleCurrentChange">
<el-table-column label="id" align="center" prop="id" />
<el-table-column label="合同编号" align="center" prop="number" width="150">
<template #default="scope">
@ -205,6 +213,7 @@
<ContractForm3 ref="formRef3" />
<RecordForm ref="recordFormRef" />
<ContractReceivablesForm ref="contractReceivablesFormRef" />
<ContractPrint ref="contractPrintRef" />
</template>
<script setup lang="ts">
@ -214,6 +223,7 @@ import { ContractApi, ContractVO } from '@/api/crm/crmcontract'
import ContractForm from './ContractForm.vue'
import ContractForm2 from './ContractForm2.vue'
import ContractForm3 from './ContractForm3.vue'
import ContractPrint from './ContractPrint.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import RecordForm from '@/views/crm/crmrecord/RecordForm.vue'
import ContractReceivablesForm from '@/views/crm/crmcontractreceivables/ContractReceivablesForm.vue'
@ -243,9 +253,12 @@ const queryParams = reactive({
const queryFormRef = ref() //
const exportLoading = ref(false) //
const activeIndex = ref('my')
const selectRow = ref({})
const isDisabled = ref(true)
/** 查询列表 */
const getList = async () => {
isDisabled.value = true
loading.value = true
try {
const data = await ContractApi.getContractPage(queryParams)
@ -266,6 +279,16 @@ const getList = async () => {
}
}
const handleCurrentChange = (val) => {
isDisabled.value = false
selectRow.value = val
}
const contractPrintRef = ref()
const openPrint = () => {
contractPrintRef.value.open(selectRow.value)
}
const handleSelect = (key) => {
queryParams.relation = key
getList()
@ -340,4 +363,5 @@ const handleExport = async () => {
onMounted(() => {
getList()
})
</script>
</script>