代码更新

This commit is contained in:
jia 2024-01-02 18:02:55 +08:00
parent 09438ebed7
commit 6a7e151789
100 changed files with 17593 additions and 256 deletions

View File

@ -2,25 +2,25 @@ import request from '@/utils/request'
// 客户跟进记录列表
export function apiCustomFollowLists(params: any) {
return request.get({ url: '/custom_follow.custom_follow/lists', params })
return request.get({ url: '/custom.custom_follow/lists', params })
}
// 添加客户跟进记录
export function apiCustomFollowAdd(params: any) {
return request.post({ url: '/custom_follow.custom_follow/add', params })
return request.post({ url: '/custom.custom_follow/add', params })
}
// 编辑客户跟进记录
export function apiCustomFollowEdit(params: any) {
return request.post({ url: '/custom_follow.custom_follow/edit', params })
return request.post({ url: '/custom.custom_follow/edit', params })
}
// 删除客户跟进记录
export function apiCustomFollowDelete(params: any) {
return request.post({ url: '/custom_follow.custom_follow/delete', params })
return request.post({ url: '/custom.custom_follow/delete', params })
}
// 客户跟进记录详情
export function apiCustomFollowDetail(params: any) {
return request.get({ url: '/custom_follow.custom_follow/detail', params })
return request.get({ url: '/custom.custom_follow/detail', params })
}

View File

@ -21,9 +21,9 @@
</template>
</el-table-column>
<el-table-column label="信用度" property="credit_rating" />
<!-- <el-table-column label="省" property="province_name" />
<el-table-column label="省" property="province_name" />
<el-table-column label="市" property="city_name" />
<el-table-column label="区" property="street_name" /> -->
<el-table-column label="区" property="area_name" />
<el-table-column label="主联系人" property="master_name" />
<el-table-column label="联系方式" property="master_phone" />
</el-table>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,370 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="发起询价" description="Some description" />
<el-step title="型号确认" description="Some description" />
<el-step title="比价" description="Some description" />
<el-step title="通知询价人" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="询价日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择询价日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请人" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入申请人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">询价明细</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="询价分类" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑询价(比价)单表' : '新增询价(比价)单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,183 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="询价日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="附件" prop="tax" show-overflow-tooltip />
<el-table-column label="添加人" prop="tax" show-overflow-tooltip />
<el-table-column label="创建日期" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,181 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="询价日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="tax" show-overflow-tooltip />
<el-table-column label="询价分类" prop="invoicing_amount" show-overflow-tooltip />
<el-table-column label="产品描述" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="材料编码" prop="tax_rate" show-overflow-tooltip />
<el-table-column label="材料名称" prop="tax" show-overflow-tooltip />
<el-table-column label="规格型号" prop="tax" show-overflow-tooltip />
<el-table-column label="特殊属性" prop="tax" show-overflow-tooltip />
<el-table-column label="品牌" prop="tax" show-overflow-tooltip />
<el-table-column label="单位" prop="tax" show-overflow-tooltip />
<el-table-column label="供应商1" prop="tax" show-overflow-tooltip />
<el-table-column label="报价1" prop="tax" show-overflow-tooltip />
<el-table-column label="型号反馈" prop="tax" show-overflow-tooltip />
<el-table-column label="供应商2" prop="tax" show-overflow-tooltip />
<el-table-column label="报价2" prop="tax" show-overflow-tooltip />
<el-table-column label="供应商3" prop="tax" show-overflow-tooltip />
<el-table-column label="报价3" prop="tax" show-overflow-tooltip />
<el-table-column label="报价4" prop="tax" show-overflow-tooltip />
<el-table-column label="报价5" prop="tax" show-overflow-tooltip />
<el-table-column label="选定供应商" prop="tax" show-overflow-tooltip />
<el-table-column label="选定报价" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
//
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,447 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<div style="display: flex; flex-direction: row-reverse; justify-content: flex-start;margin-bottom: 30px;">
<el-select class="w-[180px]" v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="(item, index) in list2" :key="index" :label="item.name" :value="item.id" />
</el-select>
<el-select class="w-[180px]" v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</div>
<el-row>
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" @click="showDialog1 = true" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="supplier_name" readonly clearable placeholder="请选择供应商" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商编码" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="审批id" prop="approve_id">
<el-input v-model="formData.approve_id" clearable placeholder="请输入审批id" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_name" readonly clearable placeholder="请选择项目" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_code" readonly disabled placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="formData.contract_no" clearable disabled placeholder="系统自动编号" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="供应商合同号" prop="supplier_id">
<el-input v-model="supplier_contract_no" clearable placeholder="请输入供应商合同号" />
</el-form-item> </el-col> <el-col :span="24">
<el-form-item label="合同类型" prop="contract_type">
<el-radio-group v-model="formData.contract_type" placeholder="请选择合同类型" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-radio v-for="(item, index) in dictData.procurement_contract_type" :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="签订日期" prop="signing_date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.signing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择签订日期">
</el-date-picker>
</el-form-item>
</el-col> <el-col :span="24">
<el-form-item label="付款方式" prop="pay_type">
<el-radio-group v-model="formData.pay_type" placeholder="请选择付款方式">
<el-radio v-for="(item, index) in dictData.pay_type" :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item> </el-col> <el-col :span="24">
<el-form-item label="账期" prop="account_period">
<el-radio-group v-model="formData.account_period" placeholder="请选择账期">
<el-radio v-for="(item, index) in dictData.account_period" :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="合同金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入合同金额" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="不含税金额" prop="amount_excluding_tax">
<el-input v-model="formData.amount_excluding_tax" clearable placeholder="请输入不含税金额" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.amount_daxie" clearable placeholder="请输入金额大写" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="质保金比例" prop="retention_money_rate">
<el-input v-model="formData.retention_money_rate" clearable placeholder="请输入质保金比例" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="质保金" prop="retention_money" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.retention_money" clearable placeholder="请输入质保金" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item></el-col>
<el-col :span="24">
<div style="margin-bottom: 30px;">采购合同明细</div>
<div style="margin-bottom: 30px;">
<el-table :data="formData.material">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd1(row)">+</el-button>
<el-button @click="handleDelete1(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="采购申请单号" prop="material_procurement_application_id">
<template #default="{ row }">
<el-input v-model="row.material_procurement_application_id" />
</template>
</el-table-column>
<el-table-column label="材料名称" prop="material_procurement_application_id">
<template #default="{ row }"> <el-input v-model="row.material_procurement_application_id" /> </template></el-table-column>
<el-table-column label="材料编码" prop="material_procurement_application_id">
<template #default="{ row }"> <el-input v-model="row.material_procurement_application_id" /> </template></el-table-column>
<el-table-column label="规格型号" prop="material_procurement_application_id">
<template #default="{ row }">
<el-input v-model="row.material_procurement_application_id" />
</template>
</el-table-column>
<el-table-column label="数量" prop="product_num">
<template #default="{ row }">
<el-input v-model="row.product_num" />
</template>
</el-table-column>
<el-table-column label="单位" prop="tax_rate">
<template #default="{ row }">
<el-input v-model="row.tax_rate" />
</template>
</el-table-column>
<el-table-column label="数量" prop="num">
<template #default="{ row }">
<el-input v-model="row.num" />
</template>
</el-table-column>
<el-table-column label="含税单价" prop="unit_price_including_tax">
<template #default="{ row }">
<el-input v-model="row.unit_price_including_tax" />
</template>
</el-table-column>
<el-table-column label="税率" prop="tax_rate">
<template #default="{ row }">
<el-input v-model="row.tax_rate" />
</template>
</el-table-column>
<el-table-column label="不含税金额" prop="amount_excluding_tax">
<template #default="{ row }">
<el-input v-model="row.amount_excluding_tax" />
</template>
</el-table-column>
<el-table-column label="含税金额" prop="amount_including_tax">
<template #default="{ row }">
<el-input v-model="row.amount_including_tax" />
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-bottom: 30px;">付款计划</div>
<div style="margin-bottom: 30px;">
<el-table :data="formData.pay_plan">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="期次" prop="name1">
<template #default="{ row }">
<el-select v-model="row.period" clearable placeholder="请选择期次">
<el-option v-for="(item, index) in dictData.pay_period " :key="index" :label="item.name" :value="item.id" />
</el-select>
</template>
</el-table-column>
<el-table-column label="计划付款日期" prop="pay_date">
<template #default="{ row }">
<el-date-picker v-model="row.pay_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择签订日期">
</el-date-picker>
</template></el-table-column>
<el-table-column label="金额" prop="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </template></el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" />
</template>
</el-table-column>
</el-table>
</div>
</el-col>
</el-row>
</el-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectTable @customEvent="customEvent"></projectTable>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择供应商" width="70%">
<suppliertable @customEvent="customEvent1"></suppliertable>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectTable from '@/components/project/index.vue'
import suppliertable from '@/components/supplier/index.vue'
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import { apiProcurementContractAdd, apiProcurementContractEdit, apiProcurementContractDetail } from '@/api/procurement_contract'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const project_name = ref('')
const project_code = ref('')
const supplier_name = ref('')
const supplier_code = ref('')
const supplier_contract_no = ref('')
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
feedback.msgError(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
const handleAdd = (row: any) => {
// row
const index = formData.pay_plan.indexOf(row);
formData.pay_plan.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = formData.pay_plan.indexOf(row);
formData.pay_plan.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = formData.pay_plan.indexOf(row);
formData.material.splice(index + 1, 0, {});
};
const handleDelete1 = (row: any) => {
// row
const index = formData.pay_plan.indexOf(row);
formData.material.splice(index, 1);
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑采购合同' : '新增采购合同'
})
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
if (res.length > 0 && !formData.org_id) {
formData.org_id = res[0].id
deptAll({ 'org_id': res[0].id }).then((res) => {
if (res.length > 0) {
Object.assign(list2, res)
formData.dept_id = res[0].id
}
})
}
})
}
//
const deptrmt = (e: any) => {
formData.dept_id = ''
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
list2.splice(0, list2.length, ...res)
})
}
//
const formData = reactive({
id: '',
dept_id: '',
org_id: '',
supplier_id: '',
approve_id: '',
project_id: '',
contract_no: '',
contract_type: '',
signing_date: '',
pay_type: '',
account_period: '',
amount: '',
amount_excluding_tax: '',
amount_daxie: '',
retention_money_rate: '',
retention_money: '',
remark: '',
annex: '',
material: [{
material_procurement_application_id: 2222,
num: 0,
unit_price_including_tax: 0,
tax_rate: "",
amount_excluding_tax: 0,
amount_including_tax: 0
}],
pay_plan: [{
period: '',
pay_date: '',
pay_amount: '',
remark: ''
}]
})
const customEvent = (e: any) => {
project_name.value = e.name
formData.project_id = e.id
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.supplier_id = e.id;
supplier_code.value = e.supplier_code
supplier_name.value = e.supplier_name
showDialog1.value = false;
};
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
if (data.dept_id) {
getlist1(data.org_id)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
project_name.value = data.project.name
project_code.value = data.project.project_code
//@ts-ignore
formData.signing_date = timeFormat(formData.signing_date, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiProcurementContractDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiProcurementContractEdit(data)
: await apiProcurementContractAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,191 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="材料类别" prop="tax_rate" show-overflow-tooltip />
<el-table-column label="材料中类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料小类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料名称" prop="tax" show-overflow-tooltip />
<el-table-column label="材料编码" prop="tax" show-overflow-tooltip />
<el-table-column label="规格型号" prop="tax" show-overflow-tooltip />
<el-table-column label="品牌" prop="tax" show-overflow-tooltip />
\
<el-table-column label="单位" prop="tax" show-overflow-tooltip />
<el-table-column label="订单数量" prop="tax" show-overflow-tooltip />
<el-table-column label="已发货数量" prop="tax" show-overflow-tooltip />
<el-table-column label="未发货数量" prop="tax" show-overflow-tooltip />
<el-table-column label="库存数量" prop="tax" show-overflow-tooltip />
<el-table-column label="在途采购量" prop="tax" show-overflow-tooltip />
<el-table-column label="安全库存量" prop="tax" show-overflow-tooltip />
<el-table-column label="缺口数量" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,173 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="供应方式" prop="project_code" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="库存数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="占用数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="可用数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="库存金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,416 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="材料大类" prop="contract_id">
<el-input v-model="project_name" clearable placeholder="材料大类" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="材料中类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="材料中类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料小类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="材料小类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料编码" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入材料编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品牌" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入品牌" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料名称" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入材料名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="规格型号" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入规格型号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参数说明" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入参数说明" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="安全库存量" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入安全库存量" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="销售指导价" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入销售指导价" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="预算成本价" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入预算成本价" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">盘点材料清单</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label=" 仓库名称" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑月度盘点表' : '新增月度盘点表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,180 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="材料大类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,373 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="发起询价" description="Some description" />
<el-step title="型号确认" description="Some description" />
<el-step title="比价" description="Some description" />
<el-step title="通知询价人" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="盘点日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择询价日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="盘点负责人" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入盘点负责人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">盘点材料清单</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label=" 仓库名称" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑月度盘点表' : '新增月度盘点表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,183 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="询价日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="附件" prop="tax" show-overflow-tooltip />
<el-table-column label="添加人" prop="tax" show-overflow-tooltip />
<el-table-column label="创建日期" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,182 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="ID" prop="customer_name" show-overflow-tooltip />
<el-table-column label="盘点单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="年" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="月" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出库日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="库存数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="剩余数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="使用数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,289 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="出库流水表ID" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请选择出库流水" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="序列号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入序列号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择出库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料类别" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料类别" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料中类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料中类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料小类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料小类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="规格型号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入规格型号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品牌" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入品牌" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参数说明" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入参数说明" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入单位" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑序列号出库表' : '新增序列号出库表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,184 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="序列号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="出库日期" prop="customer_name" show-overflow-tooltip />
<el-table-column label="仓库" prop="customer_name" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,288 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="入库流水表ID" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请选择入库流水" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="序列号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入序列号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择入库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料类别" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料类别" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料中类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料中类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料小类" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料小类" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="材料编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入材料编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="规格型号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入规格型号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="品牌" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入品牌" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参数说明" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入参数说明" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入单位" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑序列号入库表' : '新增序列号入库表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,184 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="序列号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="入库日期" prop="customer_name" show-overflow-tooltip />
<el-table-column label="仓库" prop="customer_name" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,395 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="发起询价" description="Some description" />
<el-step title="型号确认" description="Some description" />
<el-step title="比价" description="Some description" />
<el-step title="通知询价人" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="调出项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调出仓库" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调入项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调入仓库" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调出负责人" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调入负责人" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调拨日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择调拨日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">调拨明细</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="供应方式" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="参数说明" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="数量" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑调拨单表' : '新增调拨单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,183 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="询价日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="附件" prop="tax" show-overflow-tooltip />
<el-table-column label="添加人" prop="tax" show-overflow-tooltip />
<el-table-column label="创建日期" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,395 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="发起询价" description="Some description" />
<el-step title="型号确认" description="Some description" />
<el-step title="比价" description="Some description" />
<el-step title="通知询价人" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="调出项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调出仓库" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调入项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调入仓库" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调出负责人" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="调入负责人" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调拨日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择调拨日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">调拨明细</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="供应方式" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="参数说明" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="数量" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑调拨单表' : '新增调拨单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,194 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="调拨单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="调出项目名称" prop="customer_name" show-overflow-tooltip />
<el-table-column label="调出项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="调出仓库" prop="project_name" show-overflow-tooltip />
<el-table-column label="调出仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="调入项目名称" prop="customer_name" show-overflow-tooltip />
<el-table-column label="调入项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="调入仓库" prop="project_name" show-overflow-tooltip />
<el-table-column label="调入仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="调拨日期" prop="tax" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="调出单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="调出金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,381 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="填写申请" description="Some description" />
<el-step title="项目经理审核" description="Some description" />
<el-step title="财务" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="处理日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择处理日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">材料清单</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="仓库名称" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="供应方式" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="库存数量" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="处理单价" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="处理金额" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑余料处理单表' : '新增余料处理单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,183 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="询价日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="附件" prop="tax" show-overflow-tooltip />
<el-table-column label="添加人" prop="tax" show-overflow-tooltip />
<el-table-column label="创建日期" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,190 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="ID" prop="customer_name" show-overflow-tooltip />
<el-table-column label="余料处理单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="订单编号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="处理日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="库存数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="处理单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="处理金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,315 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="Step 1" description="Some description" />
<el-step title="Step 2" description="Some description" />
<el-step title="Step 3" description="Some description" />
<el-step title="Step 4" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择申请日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="希望到货日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择希望到货日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑采购需求目表' : '新增采购需求表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,191 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="MRP建议" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="希望到货日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="tax_rate" show-overflow-tooltip />
<el-table-column label="材料中类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料小类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料名称" prop="tax" show-overflow-tooltip />
<el-table-column label="材料编码" prop="tax" show-overflow-tooltip />
<el-table-column label="规格型号" prop="tax" show-overflow-tooltip />
<el-table-column label="品牌" prop="tax" show-overflow-tooltip />
<el-table-column label="参数说明" prop="tax" show-overflow-tooltip />
<el-table-column label="单位" prop="tax" show-overflow-tooltip />
<el-table-column label="申请采购数量" prop="tax" show-overflow-tooltip />
<el-table-column label="已采购数量" prop="tax" show-overflow-tooltip />
<el-table-column label="已调拨数量" prop="tax" show-overflow-tooltip />
<el-table-column label="缺口数量" prop="tax" show-overflow-tooltip />
<el-table-column label="库存数量" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,188 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="出库单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="订单编号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出货方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出库日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="退库数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="退库金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="是否锁定" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="添加人" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="创建日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="更新人" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="更新日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,344 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="入库流水编号" prop="contract_id">
<el-input v-model="project_name" clearable />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单据类型" prop="contract_id">
<el-input v-model="project_name" clearable />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应方式" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="供应方式" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择出库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仓库" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入仓库" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仓库编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入仓库编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入供应商" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入供应商编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料类别" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料类别" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料中类" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料中类" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料小类" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料小类" />
</el-form-item>
</el-col> <el-col :span="12">
<el-form-item label="材料名称" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入规格型号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="品牌" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入品牌" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="特殊属性" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入特殊属性" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入单位" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出库数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入出库数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成本单价" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入成本单价" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成本金额" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入成本金额" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否占用" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入是否占用" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已退货数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入已退货数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="未退货数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入未退货数量" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑出库流水表' : '新增出库流水表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,198 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="ID" prop="customer_name" show-overflow-tooltip />
<el-table-column label="单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="入库流水编号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="单据类型" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出库日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应商" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="特殊属性" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出库数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="成本单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="成本金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="是否占用" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="已退货数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="未退货数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,390 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="提交申请" description="Some description" />
<el-step title="库管出库" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择出库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="领用人" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入领用人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出库负责人" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入出库负责人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">出库清单</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="供应方式" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="参数说明" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="数量" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑出库单表' : '新增出库单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,181 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="采购申请单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="开票日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="希望到货日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,315 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="Step 1" description="Some description" />
<el-step title="Step 2" description="Some description" />
<el-step title="Step 3" description="Some description" />
<el-step title="Step 4" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择申请日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="希望到货日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择希望到货日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑采购需求目表' : '新增采购需求表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,181 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="采购申请单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="开票日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="希望到货日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="申请人" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,459 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="Step 1" description="Some description" />
<el-step title="Step 2" description="Some description" />
<el-step title="Step 3" description="Some description" />
<el-step title="Step 4" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择开票日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no" @click="showDialog1 = true">
<el-input v-model="contract_no" clearable readonly placeholder="请选择合同" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额" prop="project_amount">
<el-input v-model="project_amount" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次" prop="period" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-select class="flex-1" v-model="formData.period" clearable placeholder="请选择期次">
<el-option v-for="(item, index) in dictData.pay_period" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额" prop="accumulate_amount">
<el-input v-model="formData.accumulate_amount" clearable placeholder="请输入累计开票金额" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额" prop="accumulated_payments_received">
<el-input v-model="formData.accumulated_payments_received" clearable placeholder="请输入累计回款金额" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率" prop="tax_rate">
<el-input v-model="formData.tax_rate" clearable placeholder="请输入税率" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型" prop="contacts">
<el-select class="flex-1" v-model="formData.invoice_type" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)" prop="invoicing_amount">
<el-input v-model="formData.invoicing_amount" clearable placeholder="请输入开票金额(含税)" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="invoicing_amount_daxie">
<el-input v-model="formData.invoicing_amount_daxie" clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)" prop="tax">
<el-input v-model="formData.tax" clearable placeholder="请输入开票金额(税额)" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)" prop="amount_including_tax">
<el-input v-model="formData.amount_including_tax" clearable placeholder="请输入开票金额(非税)" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="开票内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入开票内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户开票信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input v-model="formData.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号" prop="taxpayer_identification_number">
<el-input v-model="formData.taxpayer_identification_number" clearable placeholder="请输入纳税人识别号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行" prop="deposit_bank">
<el-input v-model="formData.deposit_bank" clearable placeholder="请输入开户银行" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="账号" prop="bank_accnout">
<el-input v-model="formData.bank_accnout" clearable placeholder="请输入开票公司名称" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="开户地址及电话" prop="address_phone">
<el-input v-model="formData.address_phone" clearable placeholder="请输入开户地址及电话" />
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">发票邮寄信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收票地址" prop="receiving_address">
<el-input v-model="formData.receiving_address" clearable placeholder="请输入收票地址" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系人" prop="contacts">
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="phone" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.phone" clearable placeholder="请输入联系电话" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="邮寄时间" prop="mailing_time">
<el-date-picker class="flex-1 !flex" v-model="formData.mailing_time" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择邮寄时间">
</el-date-picker>
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="邮寄方式" prop="mailing_type">
<el-input v-model="formData.mailing_type" clearable placeholder="请输入邮寄方式" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号" prop="mailing_no">
<el-input v-model="formData.mailing_no" clearable placeholder="请输入邮寄单号" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1" contract_type="2"></salescontractDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import salescontractDialog from '@/components/salescontract/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑项目表' : '新增项目表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,191 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="客户" prop="采购申请单号" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="申请日期" prop="invoicing_amount" show-overflow-tooltip />
<el-table-column label="希望到货日期" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="材料类别" prop="tax_rate" show-overflow-tooltip />
<el-table-column label="材料中类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料小类" prop="tax" show-overflow-tooltip />
<el-table-column label="材料名称" prop="tax" show-overflow-tooltip />
<el-table-column label="材料编码" prop="tax" show-overflow-tooltip />
<el-table-column label="规格型号" prop="tax" show-overflow-tooltip />
<el-table-column label="品牌" prop="tax" show-overflow-tooltip />
<el-table-column label="参数说明" prop="tax" show-overflow-tooltip />
<el-table-column label="单位" prop="tax" show-overflow-tooltip />
<el-table-column label="申请采购数量" prop="tax" show-overflow-tooltip />
<el-table-column label="已采购数量" prop="tax" show-overflow-tooltip />
<el-table-column label="已调拨数量" prop="tax" show-overflow-tooltip />
<el-table-column label="未采购数量" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,409 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="单据类型" prop="contract_id">
<el-input v-model="project_name" clearable />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应方式" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="供应方式" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仓库" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入仓库" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仓库编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入仓库编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入供应商" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入供应商编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择入库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料类别" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料类别" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料中类" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料中类" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料小类" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料小类" />
</el-form-item>
</el-col> <el-col :span="12">
<el-form-item label="材料名称" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="材料编码" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入材料编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入规格型号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="品牌" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入品牌" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="参数说明" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入参数说明" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已出库数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入已出库数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="未出库数" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入未出库数" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="占用数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入占用数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="可用数量" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入可用数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="含税单价" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入含税单价" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="库存金额" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入库存金额" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑入库流水表' : '新增入库流水表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,197 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="ID" prop="customer_name" show-overflow-tooltip />
<el-table-column label="单据类型" prop="customer_name" show-overflow-tooltip />
<el-table-column label="同步记录ID" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应商" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="入库日期" prop="invoicing_date" show-overflow-tooltip />\
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="已出库数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="未出库数量 " prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="占用数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="已退货数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="可用数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="含税单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="库存金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,315 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="Step 1" description="Some description" />
<el-step title="Step 2" description="Some description" />
<el-step title="Step 3" description="Some description" />
<el-step title="Step 4" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择申请日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="希望到货日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择希望到货日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑采购需求目表' : '新增采购需求表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,198 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="退库单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="出库单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="customer_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="订单编号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="出货方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="供应方式" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="退库日期" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料类别" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料中类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料小类" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料名称" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="材料编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="规格型号" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="品牌" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="参数说明" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单位" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="数量" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="单价" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="金额" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,413 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="提交申请" description="Some description" />
<el-step title="库管出库" description="Some description" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="出库单号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入出库单号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出货方式" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入出货方式" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入仓库编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入客户名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="订单编号" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入订单编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退库人" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入退库人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退库日期" prop="invoicing_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.invoicing_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择退库日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">退库清单</div>
<el-row>
<el-table :data="tablist1">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="供应方式" prop="name1">
<template #default="{ row, $index }">
<el-input v-model="row.name1" readonly @click="subjectmu(row, $index)" />
</template>
</el-table-column>
<el-table-column label="材料编码" prop="name2">
<template #default="{ row }">
<el-input v-model="row.name2" readonly />
</template></el-table-column>
<el-table-column label="材料名称" prop="use_to">
<template #default="{ row }">
<el-input v-model="row.use_to" /> </template>
</el-table-column>
<el-table-column label="规格型号" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" type="number" /> </template>
</el-table-column>
<el-table-column label="品牌" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="参数说明" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="单位" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="数量" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" /> </template>
</el-table-column>
</el-table>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const tablist1 = reactive([{}])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = tablist1.indexOf(row);
tablist1.splice(index, 1);
};
const handleAdd1 = (row: any) => {
// row
const index = tablist2.indexOf(row);
tablist2.splice(index + 1, 0, {});
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退库单表' : '新增退库单表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,182 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="处理流程" prop="customer_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="customer_name" show-overflow-tooltip />
<el-table-column label="退库单号" prop="customer_name" show-overflow-tooltip />
<el-table-column label="出库单号" prop="project_code" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_name" show-overflow-tooltip />
<el-table-column label="订单编号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="退库日期" prop="project_name" show-overflow-tooltip />
<el-table-column label="退库人" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="备注" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -0,0 +1,283 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="开票申请详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称">
{{ formData.custom.name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码">
{{ formData.project_code
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号">
{{ formData.contract.contract_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称">
{{ formData.contract ? formData.contract.contract_code : '暂无数据' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同金额">
{{ formData.contract.amount
}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期次">
<dict-value :options="dictData.pay_period" :value="formData.period" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计开票金额">
{{ formData.accumulate_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="累计回款金额">
{{ formData.accumulated_payments_received }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率">
{{ formData.tax_rate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票类型">
<dict-value :options="dictData.invoice_type" :value="formData.invoice_type" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(含税)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写">
{{ formData.invoicing_amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(税额)">
{{ formData.invoicing_amount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票金额(非税)">
{{ formData.amount_including_tax }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票编号">
{{ formData.invoice_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开票公司名称">
{{ formData.invoicing_company_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="纳税人识别号">
{{ formData.taxpayer_identification_number }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账号">
{{ formData.bank_accnout }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户地址及电话">
{{ formData.address_phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收票地址">
{{ formData.receiving_address }}
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="联系人">
{{ formData.contacts }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ formData.phone }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄时间">
{{ formData.mailing_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄方式">
{{ formData.mailing_type }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮寄单号">
{{ formData.mailing_no }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
// for (const key in formData) {
// if (data[key] != null && data[key] != undefined) {
// //@ts-ignore
// formData[key] = data[key]
// }
// }
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: formData.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,317 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库编码" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="仓库编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="仓库名称" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="仓库名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="MRP仓库" prop="contract_id">
<el-input v-model="project_code" clearable disabled placeholder="MRP仓库" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="负责人" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入负责人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地址" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入地址" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="invoice_no">
<el-input v-model="formData.invoice_no" clearable placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
</el-form-item> -->
<el-form-item label="附件" prop="field127">
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog1" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent1" contract_type="2"></projectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { apiinvoiceapplyAdd, apiinvoiceapplyEdit, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.invoicing_amount_daxie = toChinesNum(e)
}
}
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const showDialog = ref(false)
const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
project_amount.value = e.amount
showDialog1.value = false;
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑仓库管理表' : '新增仓库管理表'
})
//
const formData = reactive({
id: '',
customer_id: '',
contract_id: '',
approve_id: '',
invoicing_date: "",
period: "",
accumulate_amount: '',
accumulated_payments_received: '',
tax_rate: "",
invoice_type: '',
invoicing_amount: '',
invoicing_amount_daxie: "",
tax: '',
amount_including_tax: '',
content: "",
invoice_no: "",
remark: "",
annex: "",
invoicing_company_name: "",
taxpayer_identification_number: "",
deposit_bank: "",
bank_accnout: "",
address_phone: "",
receiving_address: "",
contacts: "",
phone: "",
mailing_time: "",
mailing_type: "",
mailing_no: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (formData.invoicing_amount) {
toChinesNum(formData.invoicing_amount)
}
custom_name.value = data.custom.name
project_name.value = data.contract_name;
project_code.value = data.contract_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiinvoiceapplyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apiinvoiceapplyEdit(data)
: await apiinvoiceapplyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,177 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="开票公司名称" prop="invoicing_company_name">
<el-input class="w-[280px]" v-model="queryParams.invoicing_company_name" clearable placeholder="请输入开票公司名称" />
</el-form-item>
<el-form-item label="客户" prop="customer_id">
<el-select class="w-[280px]" v-model="queryParams.customer_id" clearable placeholder="请选择客户">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, i) in list1" :key="i" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同" prop="contract_id">
<el-select class="w-[280px]" v-model="queryParams.contract_id" clearable placeholder="请选择合同">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in list" :key="index" :label="item.contract_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="仓库编码" prop="invoicing_date" show-overflow-tooltip />
<el-table-column label="仓库名称" prop="tax" show-overflow-tooltip />
<el-table-column label="MRP仓库" prop="tax" show-overflow-tooltip />
<el-table-column label="负责人" prop="tax" show-overflow-tooltip />
<el-table-column label="地址" prop="tax" show-overflow-tooltip />
<el-table-column label="备注" prop="tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['InvoicingRequests.InvoicingRequests/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['InvoicingRequests.InvoicingRequests/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiinvoiceapplyLists, apiinvoiceapplyDelete, apiinvoiceapplyDetail } from '@/api/InvoicingRequests'
import { timeFormat } from '@/utils/util'
import { apiContractLists } from '@/api/contract'
import { apiCustomLists } from '@/api/custom'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const list = ref([])
const list1 = ref([])
//
const queryParams = reactive({
invoicing_company_name: '',
contract_id: '',
customer_id: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_period,invoice_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiinvoiceapplyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiinvoiceapplyDelete({ id })
getLists()
}
//
const handledetail = async (data: any) => {
let res = await apiinvoiceapplyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const getlist1 = () => {
apiContractLists().then((res) => {
list.value = res.lists
})
}
//
const getlist2 = () => {
apiCustomLists().then((res) => {
// console.log(res)
list1.value = res.lists
})
}
getlist1()
getlist2()
getLists()
</script>

View File

@ -20,37 +20,37 @@
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<el-input v-model="customer_name" readonly clearable placeholder="请输入客户名称" />
<el-input v-model="customer_name" readonly clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
<el-input v-model="project_name" clearable placeholder="请选择项目" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="reimburser" @click="showDialog2 = true">
<el-input v-model="contract_name" readonly clearable placeholder="请输入合同名称" />
<el-input v-model="contract_name" readonly clearable placeholder="请选择合同" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编码" prop="reimburser">
<el-input v-model="contract_no" readonly clearable placeholder="请输入合同编码" />
<el-input v-model="contract_no" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="contract_type">
<el-select v-model="contract_type" clearable placeholder="请选择合同类型">
<el-select v-model="contract_type" clearable disabled placeholder="系统自动填写">
<el-option v-for="(item, index) in dictData.contract_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item></el-col>

View File

@ -184,7 +184,7 @@ const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }

View File

@ -98,7 +98,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="进度">
<el-form-item label="进度(%)">
{{ formData.completion_degree }}
</el-form-item>
</el-col>

View File

@ -38,18 +38,18 @@
<el-table-column label="作业编码" prop="zy_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="分项工程" prop="subentry_engineering" show-overflow-tooltip />
<el-table-column label="工序步骤号" prop="process_step_no" show-overflow-tooltip />
<el-table-column label="工序步骤号" prop="process_step_no" width="125" show-overflow-tooltip />
<el-table-column label="工序步骤" prop="process_step" show-overflow-tooltip />
<el-table-column label="计划开始日期" prop="plan_start_date" show-overflow-tooltip />
<el-table-column label="计划结束日期" prop="plan_end_date" show-overflow-tooltip />
<el-table-column label="计划开始日期" prop="plan_start_date" width="135" show-overflow-tooltip />
<el-table-column label="计划结束日期" prop="plan_end_date" width="135" show-overflow-tooltip />
<el-table-column label="班组长" prop="project_member_name" show-overflow-tooltip />
<el-table-column label="施工人员" prop="work_user" show-overflow-tooltip />
<el-table-column label="施工内容" prop="work_content" show-overflow-tooltip />
<el-table-column label="作业量" prop="workload" show-overflow-tooltip />
<el-table-column label="单位" prop="unit" show-overflow-tooltip />
<el-table-column label="完工作业量 " prop="sort" show-overflow-tooltip />
<el-table-column label="剩余作业量" prop="plan_start_date" show-overflow-tooltip />
<el-table-column label="进度" prop="plan_end_date" show-overflow-tooltip />
<el-table-column label="完工作业量 " prop="done_workload" width="125" show-overflow-tooltip />
<el-table-column label="剩余作业量" prop="residue_workload" width="125" show-overflow-tooltip />
<el-table-column label="进度(%)" prop="completion_degree" width="85" show-overflow-tooltip />
<el-table-column label="单价" prop="price" show-overflow-tooltip />
<el-table-column label="金额" prop="amount" show-overflow-tooltip />

View File

@ -44,7 +44,8 @@
</el-col>
<el-col :span="24">
<el-form-item label="图例说明">
<material-picker v-model="formData.annex" />
<material-picker v-model="formData.annex" :limit="100" />
</el-form-item>
</el-col>
<el-col :span="24">

View File

@ -163,7 +163,7 @@
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>

View File

@ -22,7 +22,7 @@
<el-input v-model="custom_name" disabled clearable placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="需求名称" prop="customer_demand_id">
<el-input v-model="customer_demand_name" clearable placeholder="选择需求" @click="showDialog1 = true" />
<el-input v-model="customer_demand_name" clearable readonly placeholder="选择需求" @click="xuDialog" />
</el-form-item>
<el-form-item label="竞争对手名称" prop="competitor_name">
<el-input v-model="formData.competitor_name" clearable placeholder="请输入竞争对手名称" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" />
@ -107,6 +107,7 @@ const formDataannex = reactive([])
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
import feedback from '@/utils/feedback'
const userStore = useUserStore();
//
@ -130,6 +131,7 @@ const delFileFn = (index: number) => {
// dialog
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
@ -166,7 +168,14 @@ const area_change = (e: any) => {
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑竞争对手' : '新增竞争对手'
})
//
const xuDialog = () => {
if (formData.project_id) {
showDialog1.value = true
} else {
feedback.msgError('请先选择项目')
}
}
//
const formData = reactive({
id: '',
@ -186,17 +195,12 @@ const formData = reactive({
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
// if (!value) {
// return callback(new Error(''))
// }
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
} else {
callback(new Error('电话号码格式不正确'))
}
}, 100)
if (value && !phoneReg.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
//
const formRules = reactive<any>({

View File

@ -39,7 +39,7 @@
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label="客户需求id" prop="customer_demand_id" show-overflow-tooltip />
<el-table-column label="客户需求" prop="customer_demand_name" show-overflow-tooltip />
<el-table-column label="竞争对手名称" prop="competitor_name" show-overflow-tooltip />
<el-table-column label="竞争对手联系人" prop="competitor_contacts" show-overflow-tooltip />
<el-table-column label="联系人电话" prop="competitor_contacts_phone" show-overflow-tooltip />

View File

@ -15,22 +15,28 @@
<el-col :span="8">
<el-form-item label="客户" prop="customer_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" readonly clearable placeholder="请选择客户" />
</el-form-item> </el-col><el-col :span="8">
<el-form-item label="投标编号" prop="buy_bidding_document_id" @click="showDialog1 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="bidding_code" readonly clearable placeholder="请选择购买标书" />
</el-form-item></el-col><el-col :span="8">
<el-form-item label="项目名称" prop="buy_bidding_document_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="document_name" readonly clearable placeholder="请选择购买标书" />
</el-form-item></el-col><el-col :span="8">
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="投标编号" prop="buy_bidding_document_id" @click="showDialog1 = true">
<el-input v-model="bidding_code" readonly clearable placeholder="请选择投标编号" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="buy_bidding_document_id" @click="tanchuan" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="document_name" readonly clearable placeholder="请选择项目" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="buy_bidding_document_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="document_code" readonly clearable placeholder="请选择购买标书" />
</el-form-item></el-col><el-col :span="8">
<el-input v-model="document_code" clearable disabled placeholder="系统自动填写" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item></el-col><el-col :span="8">
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_code" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.contract_code" clearable placeholder="请输入合同编号" />
</el-form-item></el-col><el-col :span="8">
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="contract_type" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-select class="flex-1" v-model="formData.contract_type" clearable placeholder="请选择合同类型">
<el-option v-for="(item, index) in dictData.contract_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
@ -136,13 +142,13 @@
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择标书" width="70%">
<biddocumentTable @customEvent="customEvent1"></biddocumentTable>
</el-dialog>
<el-dialog v-model="showDialog2" title="选择项目" width="70%">
<projectTable @customEvent="customEvent2" :customer_id="formData.customer_id"></projectTable>
</el-dialog>
</div>
</template>
@ -151,7 +157,7 @@ import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import biddocumentTable from "@/components/biddocument/index.vue"
import reviewprocess from '@/components/reviewprocess/index.vue'
import projectTable from "@/components/project/index.vue"
import { apiContractAdd, apiContractEdit, apiContractDetail } from '@/api/contract'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
@ -172,6 +178,7 @@ import useUserStore from "@/stores/modules/user";
import { toChinesNum } from "@/utils/util";
const showDialog = ref(false)
const showDialog1 = ref(false)
const showDialog2 = ref(false)
const custom_name = ref('')
const document_name = ref('')
const document_code = ref('')
@ -180,6 +187,7 @@ const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import feedback from '@/utils/feedback'
const userStore = useUserStore();
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
@ -225,6 +233,15 @@ const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const tanchuan = () => {
if (formData.customer_id) {
showDialog2.value = true
} else {
feedback.msgError('请先选择客户')
}
}
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
@ -239,6 +256,11 @@ const customEvent1 = (e: any) => {
bidding_code.value = e.bid_document_no
showDialog1.value = false;
};
const customEvent2 = (e: any) => {
document_name.value = e.name;
document_code.value = e.project_code
showDialog2.value = false;
};
//
const amountinput = (e) => {

View File

@ -114,8 +114,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电话" prop="master_telephone">
<el-input v-model="formData.master_telephone" placeholder="请输入电话" clearable :style="{ width: '100%' }">
<el-form-item label="座机" prop="master_telephone">
<el-input v-model="formData.master_telephone" placeholder="请输入座机" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
</el-col>
@ -127,10 +127,72 @@
</el-col>
</el-row>
</el-card>
<el-card class="mb-2">
<el-card class="mb-2" v-if="mode == 'add'">
<div class="tit">其他联系人</div>
<el-row>
<template v-for="(item, index) in formData.other_contacts" :key="index">
<el-table :data="formData.other_contacts">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template #default="{ row }">
<el-input v-model="row.name" />
</template></el-table-column>
<el-table-column label="职位" prop="position">
<template #default="{ row }">
<el-input v-model="row.position" />
</template></el-table-column>
<el-table-column label="手机" prop="phone">
<template #default="{ row, $index }">
<el-input v-model="row.phone" @blur="tablePhone(row, $index)" />
</template></el-table-column>
<el-table-column label="邮箱" prop="email">
<template #default="{ row, $index }">
<el-input v-model="row.email" @blur="tableEmail(row, $index)" />
</template></el-table-column>
<el-table-column label="电话" prop="telephone">
<template #default="{ row }">
<el-input v-model="row.telephone" /> </template>
</el-table-column>
<el-table-column label="备注" prop="notes">
<template #default="{ row }">
<el-input v-model="row.notes" /> </template>
</el-table-column>
<el-table-column label="附件" prop="annex">
<template #default="{ row, $index }">
<!-- <el-input v-model="row.annex" /> -->
<div>
<el-upload accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="(response, file, fileList) => { return handleAvatarSuccess_four1($index, response, file, fileList) }" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div v-if="row.annex">
<div v-for="(item, index) in row.annex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item" target="_blank">文件{{ index + 1 }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(row, index)">x</span>
</div>
</div>
</div>
</template>
</el-table-column>
</el-table>
<!-- <template v-for="(item, index) in formData.other_contacts" :key="index">
<el-col :span="12">
<el-form-item label="姓名" prop="field120">
<el-input :disabled="isDisabled" v-model="item.name" placeholder="请输入姓名" clearable :style="{ width: '100%' }"></el-input>
@ -151,14 +213,14 @@
<el-input :disabled="isDisabled" v-model="item.email" placeholder="请输入邮箱" clearable :style="{ width: '100%' }"></el-input>
</el-form-item>
</el-col>
</template>
</template> -->
<el-col :span="24">
<!-- <el-col :span="24">
<el-form-item label prop="field126">
<el-button type="primary" :disabled="isDisabled" size="medium" @click="other">添加联系人</el-button>
<el-button v-if="formData.other_contacts.length" type="primary" :disabled="isDisabled" size="medium" @click="otherdelete">删除</el-button>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
</el-card>
@ -219,10 +281,13 @@ import {
} from "@/api/common";
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import useUserStore from "@/stores/modules/user";
import Popup from '@/components/popup/index.vue'
import { apiCustomAdd, apiCustomEdit, apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
const userStore = useUserStore();
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
@ -237,8 +302,12 @@ const companyname = ref('')
const list1 = reactive([])
const showDialog = ref(false);
const list2 = reactive([])
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import feedback from "@/utils/feedback";
const datas = reactive({
provinceOptions: [],
cityOptions: [],
@ -251,7 +320,17 @@ const customEvent = (e: any) => {
showDialog.value = false;
};
const handleAdd = (row: any) => {
// row
const index = formData.other_contacts.indexOf(row);
formData.other_contacts.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = formData.other_contacts.indexOf(row);
formData.other_contacts.splice(index, 1);
};
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑客户表' : '新增客户表'
@ -259,13 +338,32 @@ const popupTitle = computed(() => {
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
if (value && !/^1[3|4|5|7|8][0-9]{9}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const tablePhone = (row, index) => {
console.log(row, index)
if (row.phone && !/^1[3|4|5|7|8][0-9]{9}$/.test(row.phone)) {
feedback.msgError('请输入正确的手机号码')
row.phone = ''
}
}
const tableEmail = (row, index) => {
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
if (row.email && !mailReg.test(row.email)) {
feedback.msgError('请输入正确的手机号码')
row.email = ''
}
// console.log(row, index)
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
if (value && !mailReg.test(value)) {
@ -330,7 +428,7 @@ const formData = reactive({
bank_name: '',
bank_account: '',
status: '',
other_contacts: [],
other_contacts: [{}],
area: ""
})
@ -341,7 +439,33 @@ const formRules = reactive<any>({
})
//
const handleAvatarSuccess_four1 = (index, response, file, fileList) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
if (!formData.other_contacts[index].annex) {
formData.other_contacts[index].annex = []; // annex
}
// console.log(formData.other_contacts[index], index, tablist2)
// console.log(index, response)
formData.other_contacts[index].annex.push({ uri: response.data.uri, name: response.data.name });
// console.log(response.data.uri, index, tablist2)
// formDataannex1.push(
// { uri: response.data.uri, name: response.data.name }
// );
};
//
const delFileFn1 = (index: number) => {
//
row.annex.splice(index, 1);
}
//
const setFormData = async (data: Record<any, any>) => {
for (const key in formData) {
@ -362,9 +486,12 @@ const setFormData = async (data: Record<any, any>) => {
if (data.dept_id) {
getlist1(data.org_id)
}
if (formData.company_name) {
companyname.value = data.company_name
}
formData.other_contacts = JSON.parse(data.other_contacts)
console.log(formData, '2222222222')
}
@ -379,6 +506,10 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formData.other_contacts && formData.other_contacts.length > 0) {
formData.other_contacts = JSON.stringify(formData.other_contacts)
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
@ -425,24 +556,7 @@ const getAreaList = async () => {
datas["areaOptions"] = data;
};
//
function other() {
formData.other_contacts.push({
name: "",
position: "",
phone: "",
email: "",
});
}
//
function otherdelete() {
formData.other_contacts.pop({
name: "",
position: "",
phone: "",
email: "",
});
}
getProvinceList();

View File

@ -2,7 +2,7 @@
<div>
<Statistics :list="list"></Statistics>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form class="mb-[-16px]" :model="queryParams" label-width="auto" inline>
<el-form-item label="客户名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
</el-form-item>
@ -12,10 +12,15 @@
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
<el-form-item label="电话" prop="master_phone">
<el-input class="w-[280px]" v-model="queryParams.master_phone" clearable placeholder="请输入电话" />
</el-form-item>
<el-form-item label="联系人" prop="master_name">
<el-input class="w-[280px]" v-model="queryParams.master_name" clearable placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="省份" prop="province">
<el-input class="w-[280px]" v-model="queryParams.province" clearable placeholder="请输入省份" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -45,19 +50,19 @@
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
</template>
</el-table-column>
<el-table-column label="联系人" prop="custom_type">
<!-- <el-table-column label="联系人" prop="custom_type">
<template #default="{ row }">
<div>
<text v-for="(item, i) in row.other_contacts" :key="i">{{ item.name }}</text>
</div>
</template>
</el-table-column>
<el-table-column label="省" prop="custom_type">
</el-table-column> -->
<!-- <el-table-column label="省" prop="custom_type">
<template #default="{ row }">
{{ row.province.province_name }}
</template>
</el-table-column>
<!-- <el-table-column label="省" prop="province_name" show-overflow-tooltip /> -->
</el-table-column> -->
<el-table-column label="省" prop="province_name" show-overflow-tooltip />
<el-table-column label="职务" prop="master_position" show-overflow-tooltip />
<el-table-column label="电话" prop="master_telephone" show-overflow-tooltip />
<el-table-column label="手机" prop="master_phone" show-overflow-tooltip />
@ -104,6 +109,7 @@ import { timeFormat } from '@/utils/util'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
import Statistics from '@/components/statistics/index.vue'
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
@ -151,11 +157,10 @@ const list = reactive([
const queryParams = reactive({
name: '',
custom_type: '',
phone: '',
credit_rating: '',
master_phone: '',
master_name: '',
province: '',
city: '',
status: ''
})
//

View File

@ -12,7 +12,7 @@
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="日期" prop="date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择日期">
</el-date-picker>
</el-form-item>
@ -21,8 +21,8 @@
<el-option v-for="(item, index) in dictData.follow_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
<el-form-item label="执行人" prop="admin_id">
<el-input v-model="formData.admin_id" clearable placeholder="请输入执行人" />
<el-form-item label="执行人" prop="executor">
<el-input v-model="formData.executor" clearable placeholder="请输入执行人" />
</el-form-item>
<el-form-item label="行动描述" prop="description">
<el-input v-model="formData.description" clearable placeholder="请输入行动描述" />
@ -34,7 +34,7 @@
<el-input v-model="formData.coordinate" clearable placeholder="请输入位置" />
</el-form-item>
<el-form-item label="下次回访日期" prop="next_follow_date">
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择下次回访日期">
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择下次回访日期">
</el-date-picker>
</el-form-item>
</el-form>
@ -101,7 +101,7 @@ const formData = reactive({
contacts: '',
date: '',
types: '',
admin_id: '',
executor: '',
description: '',
annex: '',
coordinate: '',
@ -128,11 +128,6 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
//@ts-ignore
formData.date = timeFormat(formData.date, 'yyyy-mm-dd hh:MM:ss')
//@ts-ignore
formData.next_follow_date = timeFormat(formData.next_follow_date, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {

View File

@ -36,17 +36,14 @@
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="客户名称" prop="custom_id" show-overflow-tooltip />
<el-table-column label="联系人" prop="contacts" show-overflow-tooltip />
<el-table-column label="日期" prop="date">
<template #default="{ row }">
<span>{{ row.date ? timeFormat(row.date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
</template>
</el-table-column>
<el-table-column label="日期" prop="date" show-overflow-tooltip />
<el-table-column label="类型" prop="types">
<template #default="{ row }">
<dict-value :options="dictData.follow_type" :value="row.types" />
</template>
</el-table-column>
<el-table-column label="执行人" prop="admin_id" show-overflow-tooltip />
<el-table-column label="执行人" prop="add_user" show-overflow-tooltip />
<el-table-column label="行动描述" prop="description" show-overflow-tooltip />
<el-table-column label="附件/现场照片" prop="annex">
<template #default="{ row }">
@ -60,13 +57,10 @@
</template>
</el-table-column>
<el-table-column label="位置" prop="coordinate" show-overflow-tooltip />
<el-table-column label="下次回访日期" prop="next_follow_date">
<template #default="{ row }">
<span>{{ row.next_follow_date ? timeFormat(row.next_follow_date, 'yyyy-mm-dd hh:MM:ss') : ''
}}</span>
</template>
</el-table-column>
<el-table-column label="状态" prop="status" show-overflow-tooltip />
<el-table-column label="下次回访日期" prop="next_follow_date" show-overflow-tooltip />
<!-- <el-table-column label="状态" prop="status" show-overflow-tooltip /> -->
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button v-perms="['custom_follow.custom_follow/edit']" type="primary" link @click="handleEdit(row)">

View File

@ -1,7 +1,7 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<div style="display: flex; flex-direction: row-reverse; justify-content: flex-start;margin-bottom: 30px;">
<el-select class="w-[180px]" v-model="formData.dept_id" clearable placeholder="请选择部门">
@ -24,16 +24,16 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户名称" prop="custom_id">
<el-input v-model="custom_name" readonly clearable placeholder="请输入客户名称" />
<el-form-item label="客户名称" prop="custom_id" @click="showDialog1 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" readonly clearable placeholder="请选择客户名称" />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="合同号" prop="project_id">
<el-col :span="12">
<el-form-item label="合同号" prop="project_id" @click="showDialog2 = true">
<el-input v-model="project_code" clearable readonly placeholder="系统自动填写" />
</el-form-item>
</el-col>-->
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="审批id" prop="approve_id">
<el-input v-model="formData.approve_id" clearable placeholder="请输入审批id" />
@ -52,20 +52,20 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日期" prop="date">
<el-form-item label="日期" prop="date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类" prop="classification">
<el-form-item label="分类" prop="classification" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.classification" clearable placeholder="请选择分类">
<el-option v-for="(item, index) in dictData.classification" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="紧急程度" prop="urgency">
<el-form-item label="紧急程度" prop="urgency" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-radio-group v-model="formData.urgency" placeholder="请选择紧急程度">
<el-radio v-for="(item, index) in dictData.urgency" :key="index" :label="parseInt(item.value)">
{{ item.name }}
@ -74,17 +74,17 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="接待人" prop="receiver">
<el-form-item label="接待人" prop="receiver" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.receiver" clearable placeholder="请输入接待人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指定处理人" prop="processed_admin_id" @click="userclick">
<el-form-item label="指定处理人" prop="processed_admin_id" @click="userclick" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="processed_admin_name" clearable readonly placeholder="请输入指定处理人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投诉主题" prop="name">
<el-form-item label="投诉主题" prop="name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.name" clearable placeholder="请输入投诉主题" />
</el-form-item>
</el-col>
@ -165,22 +165,22 @@ const showDialog1 = ref(false)
const showDialog2 = ref(false)
const custom_name = ref('')
const project_name = ref('')
const project_code = ref('')
const processed_admin_name = ref('')
const personnel = ref<any>()
const formDataannex = reactive([])
const customEvent = (e: any) => {
console.log(e)
formData.custom_id = e.custom_id
custom_name.value = e.custom_name
// console.log(e)
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
console.log(e)
formData.custom_id = e.custom_id
custom_name.value = e.custom_name
showDialog1.value = false;
@ -284,7 +284,7 @@ const formData = reactive({
org_id: '',
project_id: '',
custom_id: '',
approve_id: '',
approve_id: 1,
contacts: '',
phone: '',
date: '',

View File

@ -3,10 +3,14 @@
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="项目" prop="project_id">
<el-input class="w-[280px]" v-model="queryParams.project_id" clearable placeholder="请输入项目id" />
<el-select v-model="queryParams.project_id" clearable placeholder="请选择项目">
<el-option v-for="(item, index) in projectList" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="客户" prop="custom_id">
<el-input class="w-[280px]" v-model="queryParams.custom_id" clearable placeholder="请输入客户id" />
<el-select v-model="queryParams.custom_id" clearable placeholder="请选择项目">
<el-option v-for="(item, index) in customList" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="紧急程度" prop="urgency">
@ -35,11 +39,11 @@
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="流程编号" type="" width="55" />
<el-table-column label="流程步骤" type="" width="55" />
<el-table-column label="客户名称" type="" width="55" />
<el-table-column label="项目名称" type="" width="55" />
<el-table-column label="项目编码" prop="" show-overflow-tooltip />
<el-table-column label="流程编号" prop="" />
<el-table-column label="流程步骤" prop="" />
<el-table-column label="客户名称" prop="custom_name" />
<el-table-column label="项目名称" prop="project_name" />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="合同编号" prop="" show-overflow-tooltip />
<el-table-column label="投诉主题" prop="name" show-overflow-tooltip />
<el-table-column label="日期" prop="date" show-overflow-tooltip />
@ -58,7 +62,7 @@
</template>
</el-table-column>
<el-table-column label="指定处理人" prop="" show-overflow-tooltip />
<el-table-column label="指定处理人" prop="processed_admin_name" show-overflow-tooltip />
<el-table-column label="问题是否解决" prop="" show-overflow-tooltip />
<el-table-column label="完成日期" prop="" show-overflow-tooltip />
<el-table-column label="评分" prop="" show-overflow-tooltip />
@ -98,6 +102,8 @@ import { useDictData } from '@/hooks/useDictOptions'
import { apiCustomServiceLists, apiCustomServiceDelete, apiCustomServiceDetail } from '@/api/custom_service'
import { timeFormat } from '@/utils/util'
import feedback from '@/utils/feedback'
import { apiProjectLists } from '@/api/project'
import { apiCustomLists } from '@/api/custom'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
@ -106,25 +112,15 @@ const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const showEdit = ref(false)
const showDtail = ref(false)
const projectList = ref([])
const customList = ref([])
//
const queryParams = reactive({
project_id: '',
custom_id: '',
approve_id: '',
contacts: '',
phone: '',
date: '',
classification: '',
urgency: '',
receiver: '',
processed_admin_id: '',
name: '',
description: '',
notes: '',
annex: '',
status: ''
})
//
@ -175,7 +171,25 @@ const handledetail = async (data: any) => {
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
//
const projectlist = async () => {
let res = await apiProjectLists({ page_no: 1, page_size: 9999 })
projectList.value = res.lists
}
//
const customlist = async () => {
let res = await apiCustomLists({ page_no: 1, page_size: 9999 })
customList.value = res.lists
}
customlist()
projectlist()
getLists()
</script>

View File

@ -49,7 +49,7 @@
<el-col :span="8">
<el-form-item label="报销金额" prop="reimbursement_amount">
<el-input v-model="formData.reimbursement_amount" readonly clearable placeholder="请输入报销金额" @input="amountinput" />
<el-input v-model="formData.reimbursement_amount" clearable placeholder="请输入报销金额" @input="amountinput" />
</el-form-item>
</el-col>
@ -199,7 +199,7 @@
<div v-for="(item, index) in row.annex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item" target="_blank">{{ item }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(row, index)">x</span>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(row, $index)">x</span>
</div>
</div>
</div>
@ -309,7 +309,7 @@ const handleAvatarSuccess_four1 = (index, response, file, fileList) => {
};
//
const delFileFn1 = (index: number) => {
const delFileFn1 = (row, index: number) => {
//
row.annex.splice(index, 1);
}

View File

@ -2,9 +2,6 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-row>

View File

@ -3,7 +3,7 @@
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="128">
<el-col :span="8">
<el-form-item label="客户名称" prop="custom_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
@ -22,7 +22,7 @@
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="project_code">
<el-input v-model="formData.project_code" clearable placeholder="请输入项目编码" />
<el-input v-model="formData.project_code" clearable disabled placeholder="系统自动生成" />
</el-form-item>
</el-col>
<el-col :span="24">

View File

@ -51,7 +51,7 @@
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="完工量 " prop="remark" show-overflow-tooltip />
<el-table-column label="产值" prop="remark" show-overflow-tooltip />
<el-table-column label="进度" prop="remark" show-overflow-tooltip />
<el-table-column label="进度(%)" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">

View File

@ -10,12 +10,12 @@
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog2 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable readonly placeholder="请输入项目名称" />
<el-input v-model="project_name" clearable readonly placeholder="请选择项目" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable readonly placeholder="请输入项目编码" />
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>

View File

@ -18,6 +18,9 @@
<el-form-item label="技术人员" prop="technician_name">
<el-input class="w-[280px]" v-model="queryParams.technician_name" clearable placeholder="请输入技术人员" />
</el-form-item>
<el-form-item label="制单人" prop="create_user">
<el-input class="w-[280px]" v-model="queryParams.create_user" clearable placeholder="请输入制单人" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
@ -108,7 +111,7 @@ const queryParams = reactive({
contact_name: '',
contact_phone: '',
technician_name: '',
create_user: '',
})
//

View File

@ -4,8 +4,8 @@
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules" inline>
<el-row>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" />
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" @click="showDialog = true" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
@ -21,9 +21,6 @@
<el-input v-model="idcard" clearable placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="投保日期" prop="insurance_date">
<el-date-picker class="flex-1 !flex" v-model="formData.insurance_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择投保日期">

View File

@ -4,16 +4,16 @@
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-row>
<el-col :span="24" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="工种名称" prop="type_name">
<el-col :span="24">
<el-form-item label="工种名称" prop="type_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.type_name" clearable placeholder="请输入工种名称" />
</el-form-item> </el-col>
<el-col :span="24" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="工种单价" prop="type_unit_price">
<el-col :span="24">
<el-form-item label="工种单价" prop="type_unit_price" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.type_unit_price" clearable placeholder="请输入工种单价" />
</el-form-item> </el-col>
<el-col :span="24" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="每日生活费" prop="per_daily_living">
<el-col :span="24">
<el-form-item label="每日生活费" prop="per_daily_living" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.per_daily_living" clearable placeholder="请输入每日生活费" />
</el-form-item> </el-col>

View File

@ -22,32 +22,32 @@
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog2 = true">
<el-form-item label="项目名称" prop="project_id" @click="showDialog2 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="contract_id">
<el-input v-model="custom_name" clearable placeholder="请输入项目名称" />
<el-form-item label="客户名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no" @click="showDialog1 = true">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
<el-form-item label="合同编号" prop="contract_no" @click="showDialog1 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="contract_no" clearable placeholder="请选择合同" />
</el-form-item>
</el-col>
<el-col :span="8" v-if="contract_name.length > 0">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
<el-input v-model="contract_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目类型" prop="project_type_id">
<el-form-item label="项目类型" prop="project_type_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="w-[280px]" v-model="formData.project_type_id" clearable placeholder="请选择项目类型">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in protype" :key="index" :label="item.name" :value="item.id" />
@ -55,14 +55,14 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目经理" prop="project_manager" @click="userclick">
<el-form-item label="项目经理" prop="project_manager" @click="userclick" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="manage_name" readonly clearable placeholder="请输入项目经理" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目金额" prop="amount">
<el-form-item label="项目金额" prop="amount" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.amount" clearable placeholder="请输入项目金额" />
</el-form-item>
@ -75,13 +75,13 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开始日期" prop="start_date">
<el-form-item label="项目开始日期" prop="start_date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker v-model="formData.start_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择项目开始日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目交付日期" prop="delivery_date">
<el-form-item label="项目交付日期" prop="delivery_date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker v-model="formData.delivery_date" clearable type="date" value-format="YYYY-MM-DD " placeholder="选择项目交付日期">
</el-date-picker>

View File

@ -4,26 +4,26 @@
<el-form ref="formRef" :model="formData" label-width="160px" :rules="formRules">
<el-row>
<el-col :span="8">
<el-form-item label="项目" prop="project_id" @click="showDialog = true">
<el-form-item label="项目" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" readonly clearable placeholder="请选择项目" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" readonly clearable placeholder="请选择项目" />
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="角色名称" prop="project_role_id">
<el-form-item label="角色名称" prop="project_role_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="w-[280px]" v-model="formData.project_role_id" clearable placeholder="请选择角色名称">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="人员名称" prop="admin_id" @click="userclick">
<el-form-item label="人员名称" prop="admin_id" @click="userclick" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="admin_name" clearable readonly placeholder="请输入人员名称" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="人工单价" prop="working_unit_price">
<el-form-item label="人工单价" prop="working_unit_price" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.working_unit_price" clearable placeholder="请输入人工单价" />
</el-form-item> </el-col>
<el-col :span="8">

View File

@ -4,17 +4,17 @@
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-row>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="里程碑" prop="project_milestones">
<el-form-item label="里程碑" prop="project_milestones" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="w-[280px]" v-model="formData.project_milestones" clearable placeholder="请选择里程碑">
<el-option v-for="(item, index) in dictData.project_milestones" :key="index" :label="item.name" :value="parseInt(item.value)" />
@ -23,7 +23,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="日期" prop="project_milestones_date">
<el-form-item label="日期" prop="project_milestones_date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.project_milestones_date" clearable type="date" value-format="YYYY-MM-DD " placeholder="选择日期">
</el-date-picker>

View File

@ -42,12 +42,12 @@
</el-col>
<el-col :span="8">
<el-form-item label="人工单价" prop="unit_price">
<el-form-item label="人工单价" prop="unit_price" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.unit_price" clearable placeholder="请输入人工单价" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="每日生活费" prop="daily_living_expenses">
<el-form-item label="每日生活费" prop="daily_living_expenses" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.daily_living_expenses" clearable placeholder="请输入每日生活费" />
</el-form-item>
</el-col>

View File

@ -22,37 +22,37 @@
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog2 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
<el-form-item label="项目名称" prop="project_id" @click="showDialog2 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请选择项目" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目经理" prop="project_manage" @click="userclick">
<el-form-item label="项目经理" prop="project_manage" @click="userclick" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="manage_name" readonly clearable placeholder="请输入项目经理" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报日期" prop="declare_time">
<el-form-item label="填报日期" prop="declare_time" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.declare_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择项目开始日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开始日期" prop="start_time">
<el-form-item label="项目开始日期" prop="start_time" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.start_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择项目开始日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目交付日期" prop="deliver_time">
<el-form-item label="项目交付日期" prop="deliver_time" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.deliver_time" clearable type="date" value-format="YYYY-MM-DD " placeholder="选择项目交付日期">
</el-date-picker>

View File

@ -1,21 +1,21 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules" inline>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules" inline>
<el-row>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" />
<el-input v-model="project_code" clearable placeholder="请选择项目编码" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="付款类型" prop="payment_type">
<el-radio-group v-model="formData.payment_type" placeholder="请选择付款类型">
<el-radio v-for="( item, index ) in dictData.payment_type " :key="index" :label="parseInt(item.value)">
<el-radio v-for="( item, index ) in dictData.salary_payment_type " :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
@ -169,10 +169,15 @@ const customEvent1 = (e) => {
}
//
//
const paymentdetail = (row, index) => {
num.value = index
showDialog1.value = true
if (formData.project_id) {
num.value = index
showDialog1.value = true
} else {
feedback.msgError('请选择项目后,在选择人员信息')
}
}
const handleAdd = (row: any) => {

View File

@ -45,8 +45,6 @@
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="付款类型" prop="payment_type" show-overflow-tooltip />
<el-table-column label="申请日期" prop="apply_date" show-overflow-tooltip />
<el-table-column label="合计金额" prop="total_amount" show-overflow-tooltip />
<el-table-column label="合计金额大写" prop="total_amount_uppercase" show-overflow-tooltip />
@ -132,7 +130,7 @@ const handleSelectionChange = (val: any[]) => {
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,payment_type')
const { dictData } = useDictData('salary_payment_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: projectsalarypaymentLists,

View File

@ -4,16 +4,16 @@
<el-form ref="formRef" :model="formData" label-width="160px" :rules="formRules">
<el-row>
<el-col :span="8">
<el-form-item label="项目" prop="project_id" @click="showDialog = true">
<el-form-item label="项目" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" readonly clearable placeholder="请选择项目" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" readonly clearable placeholder="请选择项目" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="姓名" prop="name">
<el-form-item label="姓名" prop="name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.name" clearable placeholder="请输入姓名" />
</el-form-item> </el-col>
<el-col :span="8">
@ -29,7 +29,7 @@
<el-input v-model="formData.station" clearable placeholder="请输入岗位" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="身份" prop="identity">
<el-form-item label="身份" prop="identity" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-radio-group v-model="formData.identity" placeholder="请选择身份">
<el-radio v-for="(item, index) in dictData.identity" :key="index" :label="parseInt(item.value)">
{{ item.name }}
@ -38,7 +38,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电话" prop="phone" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-form-item label="电话" prop="phone" :rules="[{ required: true, validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.phone" clearable placeholder="请输入电话" />
</el-form-item> </el-col>
<el-col :span="8">
@ -114,9 +114,9 @@ const popupTitle = computed(() => {
})
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
// if (!value) {
// return callback(new Error(''))
// }
if (!value) {
return callback(new Error('电话号码不能为空'))
}
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
@ -127,17 +127,23 @@ const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
}, 100)
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
if (!value) {
return callback(new Error('邮箱不能为空'))
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
setTimeout(() => {
if (mailReg.test(value)) {
callback()
} else {
callback(new Error('请输入正确的邮箱格式'))
}
}, 100)
// if (!value) {
// return callback(new Error(''))
// }
// setTimeout(() => {
// if (mailReg.test(value)) {
// callback()
// } else {
// callback(new Error(''))
// }
// }, 100)
};
//
const formData = reactive({

View File

@ -29,7 +29,7 @@
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="contacts_phone" :rules="[{ required: true, message: '请输入手机号码', trigger: 'blur' }, { validator: isMobileNumber, trigger: 'blur' }]">
<el-input v-model="formData.contacts_phone" clearable placeholder="请输入联系电话" :regex="/^ 1[3 - 9]\d{ 9}$ /" @blur="handleBlur" />
<el-input v-model="formData.contacts_phone" clearable placeholder="请输入联系电话" :regex="/^ 1[3 - 9]\d{ 9}$ /" />
</el-form-item>
</el-col>
<el-col :span="8">

View File

@ -1,8 +1,8 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-form ref="formRef" :model="formData" label-width="140px" :rules="formRules">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="基本信息" name="first">
<el-row>
@ -12,14 +12,14 @@
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="组织" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="w-[180px]" v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="w-[180px]" v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="(item, index) in list2" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
@ -30,7 +30,7 @@
<el-input v-model="formData.supplier_code" readonly clearable placeholder="系统默认生成" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_name">
<el-form-item label="供应商名称" prop="supplier_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.supplier_name" clearable placeholder="请输入" />
</el-form-item>
</el-col>
@ -92,12 +92,12 @@
<el-date-picker v-model="formData.birthday" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请选择出生日期" clearable></el-date-picker>
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="电话号码" prop="phone">
<el-form-item label="电话号码" prop="phone" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.phone" clearable placeholder="请输入" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="邮箱" prop="email">
<el-form-item label="邮箱" prop="email" :rules="[{ validator: userEmail, trigger: 'blur' }]">
<el-input v-model="formData.email" clearable placeholder="请输入" /> </el-form-item></el-col>
@ -275,6 +275,32 @@ const getlist = () => {
}
})
}
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const deptrmt = (e: any) => {
formData.dept_id = ''

View File

@ -71,7 +71,7 @@
<el-col :span="8">
<el-form-item label="工作电话" prop="work_phone">
<el-form-item label="工作电话" prop="work_phone" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.work_phone" clearable placeholder="请输入工作电话" />
</el-form-item></el-col>
<el-col :span="8">
@ -80,7 +80,7 @@
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="邮件地址" prop="email">
<el-form-item label="邮件地址" prop="email" :rules="[{ validator: userEmail, trigger: 'blur' }]">
<el-input v-model="formData.email" clearable placeholder="请输入邮件地址" />
</el-form-item></el-col>
@ -109,7 +109,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="证件号码" prop="idcard">
<el-form-item label="证件号码" prop="idcard" :rules="[{ validator: IDcard, trigger: 'blur' }]">
<el-input v-model="formData.idcard" clearable placeholder="请输入证件号码" />
</el-form-item></el-col>
<el-col :span="8">
@ -235,14 +235,39 @@ const formData = reactive({
const formRules = reactive<any>({
})
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
const IDcard = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
const cardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
if (value && !cardReg.test(value)) {
callback(new Error('请输入正确的身份证号码'))
} else {
callback()
}
};
//
const setFormData = async (data: Record<any, any>) => {
supplier_name.value = data.supplier.supplier_name
supplier_code.value = data.supplier.supplier_code
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
@ -250,7 +275,6 @@ const setFormData = async (data: Record<any, any>) => {
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {

View File

@ -30,31 +30,31 @@
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="reimburser" @click="showDialog2 = true">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
<el-input v-model="contract_name" clearable placeholder="请选择合同" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编码" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编码" />
<el-input v-model="contract_no" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="contract_type">
<el-select v-model="contract_type" clearable placeholder="请选择合同类型">
<el-select v-model="contract_type" clearable disabled placeholder="系统自动填写">
<el-option v-for="(item, index) in dictData.contract_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="reimburser">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_code">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>