项目界面开发 以及施工管理以及项目人员详情对接

This commit is contained in:
jia 2023-12-27 18:02:06 +08:00
parent d866cfe34f
commit 9e11316ccb
82 changed files with 11047 additions and 847 deletions

View File

@ -24,4 +24,17 @@ export function buildplanDelete(params: any) {
// 施工计划详情
export function buildplanDetail(params: any) {
return request.get({ url: '/build.build_plan/detail', params })
}
}
//某个施工计划下的施工汇报列表
export function buildreportsDetail(params: any) {
return request.get({ url: '/build.build_plan/reports', params })
}
//某个施工计划下的人工明细列表
export function buildpersonsDetail(params: any) {
return request.get({ url: '/build.build_plan/persons', params })
}

View File

@ -28,4 +28,21 @@ export function projectpersonnelDetail(params: any) {
//获取某个项目下的所有人员
export function personneToProject(params: any) {
return request.get({ url: '/project.project_personnel/listToProject', params })
}
}
//某个人员下的劳动合同列表
export function personnelaborContracts(params: any) {
return request.get({ url: '/project.project_personnel/laborContracts', params })
}
//某个人员下的保险列表
export function personneinsurances(params: any) {
return request.get({ url: '/project.project_personnel/insurances', params })
}
//某个人员下的考勤明细列表
export function personnelattendances(params: any) {
return request.get({ url: '/project.project_personnel/attendances', params })
}
//某个人员下的施工记录列表
export function personnelbuildworks(params: any) {
return request.get({ url: '/project.project_personnel/buildworks', params })
}

27
src/api/project_salary.ts Normal file
View File

@ -0,0 +1,27 @@
import request from '@/utils/request'
// 保险管理列表
export function insurancemanagementLists(params: any) {
return request.get({ url: '/project.project_insurance_management//lists', params })
}
// 添加保险管理
export function insurancemanagementAdd(params: any) {
return request.post({ url: '/project.project_insurance_management//add', params })
}
// 编辑保险管理
export function insurancemanagementEdit(params: any) {
return request.post({ url: '/project.project_insurance_management//edit', params })
}
// 删除保险管理
export function insurancemanagementDelete(params: any) {
return request.post({ url: '/project.project_insurance_management//delete', params })
}
// 保险管理详情
export function insurancemanagementDetail(params: any) {
return request.get({ url: '/project.project_insurance_management//detail', params })
}

View File

@ -2,8 +2,8 @@
<div>
<el-card class="!border-none" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="工序步骤" prop="process_step">
<el-input class="w-[280px]" v-model="queryParams.process_step" clearable placeholder="请输入工序步骤" />
<el-form-item label="作业编码" prop="zy_code">
<el-input class="w-[280px]" v-model="queryParams.zy_code" clearable placeholder="请输入作业编码" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -31,7 +31,6 @@
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
@ -54,7 +53,7 @@ import { defineEmits } from "vue"
//
const queryParams = reactive({
process_step: ''
zy_code: ''
});

View File

@ -72,12 +72,13 @@
<el-col :span="12">
<el-form-item label="附件">
<div>
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</div>
</el-form-item>
</el-col>

View File

@ -1,6 +1,16 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="2" align-center>
<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="120px" :rules="formRules">
<div style="display: flex; flex-direction: row-reverse; justify-content: flex-start;margin-bottom: 30px;">
@ -15,16 +25,16 @@
<el-row>
<el-col :span="8">
<el-form-item label="供应商编码" prop="supplier_contract_no">
<el-input v-model="formData.supplier_contract_no" clearable placeholder="请输入供应商合同号" />
<el-form-item label="供应商编码" prop="supplier_id" @click="showDialog = true">
<el-input v-model="supplier_contract_name" readonly clearable placeholder="请选择供应商" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="供应商编码" prop="supplier_contract_no">
<el-input v-model="formData.supplier_contract_no" clearable placeholder="请输入供应商合同号" />
<el-form-item label="供应商编码" prop="supplier_id">
<el-input v-model="supplier_contract_no" disabled clearable placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="formData.contract_name" clearable placeholder="请输入供应商合同号" />
<el-input v-model="formData.contract_name" clearable placeholder="由系统自动生成" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
@ -35,7 +45,7 @@
<el-col :span="24">
<el-form-item label="采购分类" prop="contract_type">
<el-form-item label="采购分类" prop="procurement_type">
<el-radio-group v-model="formData.procurement_type" placeholder="请选择采购分类">
<el-radio v-for="(item, index) in dictData.procurement_type" :key="index" :label="parseInt(item.value)">
{{ item.name }}
@ -78,11 +88,11 @@
<el-col :span="8">
<el-form-item label="合同金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入合同金额" />
<el-input v-model="formData.amount" clearable placeholder="请输入合同金额" @input="amountinput" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合同金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable placeholder="请输入合同金额大写" />
<el-input v-model="formData.amount_daxie" disabled clearable placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="合同主要条款" prop="main_content">
@ -120,18 +130,18 @@
</el-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<procurementTable @customEvent="customEvent"></procurementTable>
</el-dialog>
<el-dialog v-model="showDialog" title="选择供应商" width="70%">
<supplierTable @customEvent="customEvent"></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 procurementTable from '@/components/procurement/index.vue'
import { toChinesNum } from "@/utils/util";
import supplierTable from '@/components/supplier/index.vue'
import { apiadministrativeAdd, apiadministrativeEdit, apiadministrativeDetail } from '@/api/administrative'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
@ -147,8 +157,8 @@ 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_contract_name = ref('')
const supplier_contract_no = ref('')
const formDataannex = reactive([])
const tableData = reactive([])
const list1 = reactive([])
@ -179,7 +189,13 @@ const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
const getlist = () => {
@ -227,24 +243,19 @@ const formData = reactive({
start_date: "",
end_date: "",
signing_date: "",
pay_type: 0,
amount: 0,
pay_type: '',
amount: '',
amount_daxie: "",
main_content: "",
remark: "",
annex: ""
})
const customEvent = (e: any) => {
project_name.value = e.name
formData.project_id = e.id
project_code.value = e.project_code
supplier_contract_name.value = e.supplier_name
formData.supplier_id = e.id
supplier_contract_no.value = e.supplier_code
showDialog.value = false;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
showDialog1.value = false;
};
//
@ -274,7 +285,9 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
if (data.amount_daxie) {
amountinput(data.amount_daxie)
}
//@ts-ignore
formData.signing_date = timeFormat(formData.signing_date, 'yyyy-mm-dd hh:MM:ss')
}

View File

@ -42,11 +42,10 @@
<el-table-column label="处理流程" prop="custom_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="custom_name" show-overflow-tooltip />
<el-table-column label="流程编号" prop="custom_name" show-overflow-tooltip />
<el-table-column label="合同名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label="合同名称" prop="contract_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="contract_no" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="supplier_code" show-overflow-tooltip />
<el-table-column label="合同金额" prop="amount" show-overflow-tooltip />
@ -126,7 +125,7 @@ const handleSelectionChange = (val: any[]) => {
}
//
const { dictData } = useDictData('procurement_contract_type,pay_type,account_period,pay_period')
const { dictData } = useDictData('procurement_contract_type,pay_type,account_period,pay_period,procurement_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiadministrativeLists,

View File

@ -28,6 +28,22 @@
</el-col>
</el-row>
<div style="margin:10px 0">施工工序</div>
<div>
<el-table :data="gxList">
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="工序步骤号" prop="process_step_no" show-overflow-tooltip />
<el-table-column label="工序步骤" prop="process_step" show-overflow-tooltip />
<el-table-column label="质量控制点" prop="quality_control_points" show-overflow-tooltip />
<el-table-column label="图例说明" prop="file" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.file && row.file.length > 0"> <material-picker v-model="row.file" /></div>
<div v-else>暂无文件</div>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
</el-form>
</popup>
@ -38,7 +54,7 @@
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { listToDivision } from '@/api/build/build_process_settings'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
@ -50,7 +66,7 @@ defineProps({
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const gxList = ref([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
@ -69,15 +85,15 @@ const formData = reactive({
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
gxlist(data.id)
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
//
const gxlist = async (id) => {
let res = await listToDivision({ division_id: id, page_no: 1, page_size: 888 })
gxList.value = res.lists
}
@ -91,6 +107,7 @@ const handleSubmit = async () => {
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
@ -107,8 +124,8 @@ const handleClose = () => {
defineExpose({
open,
setFormData,
getDetail
setFormData
})
</script>
<style lang="scss">

View File

@ -3,104 +3,166 @@
<div class="detail-popup">
<popup ref="popupRef" title="施工计划详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编码">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划开始日期">
{{ formData.plan_start_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划结束日期">
{{ formData.plan_end_date }}
</el-form-item>
</el-col>
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编码">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工序步骤号">
{{ formData.process_step_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工序步骤">
{{ formData.process_step }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划开始日期">
{{ formData.plan_start_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划结束日期">
{{ formData.plan_end_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="图例说明">
<div v-if="formData.file && formData.file.length > 0"> <material-picker v-model="formData.file" /></div>
<el-col :span="12">
<el-form-item label="工序步骤号">
{{ formData.process_step_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工序步骤">
{{ formData.process_step }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="图例说明">
<div v-if="formData.file && formData.file.length > 0"> <material-picker v-model="formData.file" /></div>
<div v-else>暂无文件</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质量控制点">
{{ formData.quality_control_points }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班组长">
{{ formData.project_member_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工人员">
{{ formData.work_user }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工内容">
{{ formData.work_content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="作业量">
{{ formData.workload }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位">
{{ formData.unit }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单价">
{{ formData.price }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="金额">
{{ formData.amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="完工作业量">
{{ formData.done_workload }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="剩余作业量">
{{ formData.residue_workload }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="进度(%)">
{{ formData.completion_degree }}
</el-form-item>
</el-col>
</el-row>
<div style="margin:10px 0">施工汇报</div>
<div>
<el-table :data="buildreportsList">
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="施工汇报单号" prop="report_code" show-overflow-tooltip />
<el-table-column label="填报人" prop="add_user_name" show-overflow-tooltip />
<el-table-column label="填报日期" prop="create_time" show-overflow-tooltip />
<el-table-column label="现场照片" prop="process_step_no" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.scene_file && row.scene_file.length > 0"> <material-picker v-model="row.scene_file" /></div>
<div v-else>暂无文件</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质量控制点">
{{ formData.quality_control_points }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班组长">
{{ formData.project_member_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工人员">
{{ formData.work_user }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工内容">
{{ formData.work_content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="作业量">
{{ formData.workload }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位">
{{ formData.unit }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单价">
{{ formData.price }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="金额">
{{ formData.amount }}
</el-form-item>
</el-col>
</template>
</el-table-column>
<el-table-column label="今日完工量" prop="report_workload" show-overflow-tooltip />
<el-table-column label="单价" prop="price" show-overflow-tooltip />
<el-table-column label="金额" prop="report_amount" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
</el-row>
</el-card>
</el-table>
</div>
<div class="flex justify-end mt-4">
<el-pagination v-model:current-page="pager1.page" v-model:page-size="pager1.size" :page-sizes="[10, 20, 30, 40]" layout="total, sizes, prev, pager, next, jumper" :total="totalnum1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" />
</div>
<div style="margin:10px 0">人工明细</div>
<div>
<el-table :data="buildpersonsList">
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="施工汇报单号" prop="report_code" show-overflow-tooltip />
<el-table-column label="日期" prop="report_date" show-overflow-tooltip />
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="工种" prop="person_work_type_text" show-overflow-tooltip />
<el-table-column label="今日完工量" prop="work_num" show-overflow-tooltip />
<el-table-column label="单位" prop="unit" show-overflow-tooltip />
<el-table-column label="单价" prop="price" show-overflow-tooltip />
<el-table-column label="金额" prop="amount" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
</el-table>
</div>
<div class="flex justify-end mt-4">
<el-pagination v-model:current-page="pager.page" v-model:page-size="pager.size" :page-sizes="[10, 20, 30, 40]" layout="total, sizes, prev, pager, next, jumper" :total="totalnum" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import { usePaging } from '@/hooks/usePaging'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { buildreportsDetail, buildpersonsDetail } from '@/api/build/build_plan'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
@ -112,27 +174,83 @@ defineProps({
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const buildpersonsList = ref([])
const buildreportsList = ref([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
const totalnum = ref(0)
const totalnum1 = ref(0)
const pager = reactive({
page: 1,
size: 10,
})
const pager1 = reactive({
page: 1,
size: 10,
})
//
const queryParams = reactive({
plan_id: '',
})
//
const buildpersons = async (id: any) => {
const data = await buildpersonsDetail({
plan_id: id,
page_no: pager1.page,
page_size: pager1.size,
})
buildpersonsList.value = data.lists
totalnum1.value = data.count
}
const handleSizeChange = (val: number) => {
// console.log(`${val} items per page`)
pager.size = val
}
const handleCurrentChange = (val: number) => {
// console.log(`current page: ${val}`)
pager.page = val
}
const handleSizeChange1 = (val: number) => {
// console.log(`${val} items per page`)
pager1.size = val
}
const handleCurrentChange1 = (val: number) => {
// console.log(`current page: ${val}`)
pager1.page = val
}
//
const buildreports = async (id: any) => {
const data = await buildreportsDetail({
plan_id: id,
page_no: pager.page,
page_size: pager.size,
})
buildreportsList.value = data.lists
totalnum.value = data.count
}
//
const formData = reactive({
})
const getLists = (e) => {
console.log(e)
}
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
buildpersons(data.id)
buildreports(data.id)
}
const getDetail = async (row: Record<string, any>) => {

View File

@ -11,33 +11,37 @@
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog2 = 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="process_id" @click="showDialog1 = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="process_step_no" clearable placeholder="请输入工序步骤号" />
<el-input v-model="process_step_no" clearable placeholder="请选择施工工序" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工序步骤" prop="process_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="process_step" clearable placeholder="请输入工序步骤" />
<el-input v-model="process_step" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-col :span="24" v-if="anneximg && anneximg.length > 0">
<el-form-item label="图例说明">
<material-picker v-model="anneximg" />
<div v-if="anneximg && anneximg.length > 0">
<material-picker v-model="anneximg" />
</div>
<div v-else>暂无图例</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="质量控制点" prop="process_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="quality_control_points" clearable placeholder="请输入质量控制点" />
<el-input v-model="quality_control_points" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
@ -56,7 +60,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="班组长" prop="project_member_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formDatamember" clearable placeholder="请输入班组长" />
<el-input v-model="formDatamember" clearable readonly placeholder="点击选择项目人员" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -224,7 +228,6 @@ const setFormData = async (data: Record<any, any>) => {
process_step.value = data.process_step
if (data.file && data.file.length > 0) {
anneximg.value = data.file
console.log(data.file, '1')
}
quality_control_points.value = data.quality_control_points

View File

@ -11,25 +11,25 @@
<el-col :span="24">
<el-form-item label="分部工程" prop="division_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="division_engineering" readonly clearable placeholder="请输入分部工程" />
<el-input v-model="division_engineering" readonly clearable placeholder="点击选择分部分项工程" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="子分部工程" prop="division_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="sub_division_engineering" readonly clearable placeholder="请输入子分部工程" />
<el-input v-model="sub_division_engineering" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="分项工程" prop="division_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="subentry_engineering" readonly clearable placeholder="请输入分项工程" />
<el-input v-model="subentry_engineering" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="分项工程编码" prop="division_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="subentry_engineering_code" readonly clearable placeholder="请输入分项工程编码" />
<el-input v-model="subentry_engineering_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">

View File

@ -8,83 +8,87 @@
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="作业编码" prop="plan_id" @click="showDialog2 = true">
<el-input v-model="zy_code" clearable placeholder="请输入作业编码" />
<el-input v-model="zy_code" clearable placeholder="点击选择施工计划" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
<el-form-item label="项目名称" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-form-item label="项目编码" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工序步骤号" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="process_step_no" clearable placeholder="请输入工序步骤号" />
<el-form-item label="工序步骤号" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="process_step_no" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工序步骤" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="process_step" clearable placeholder="请输入工序步骤" />
<el-form-item label="工序步骤" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="process_step" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="图例说明">
<material-picker v-model="process_file" />
<div v-if="process_file && process_file.length > 0">
<material-picker v-model="process_file" />
</div>
<div v-else>暂无图例</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="质量控制点" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="quality_control_points" clearable placeholder="请输入质量控制点" />
<el-input v-model="quality_control_points" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划开始日期" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="plan_start_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择计划开始日期">
<el-date-picker class="flex-1 !flex" v-model="plan_start_date" clearable type="date" value-format="YYYY-MM-DD" disabled placeholder="系统自动填写">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划结束日期" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-date-picker class="flex-1 !flex" v-model="plan_end_date" clearable type="date" value-format="YYYY-MM-DD " placeholder="选择计划结束日期">
<el-date-picker class="flex-1 !flex" v-model="plan_end_date" clearable type="date" value-format="YYYY-MM-DD " disabled placeholder="系统自动填写">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="班组长" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_member_name" clearable placeholder="请输入班组长" />
<el-input v-model="project_member_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="施工内容" prop="plan_id">
<el-input v-model="work_content" clearable placeholder="请输入施工内容" />
<el-input v-model="work_content" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="作业量" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="workload" type="number" clearable placeholder="请输入作业量" />
<el-input v-model="workload" type="number" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="剩余作业量" prop="plan_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.remark" clearable placeholder="请输入剩余作业量" />
<el-input v-model="residue_workload" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报人" prop="plan_id">
<el-input v-model="formData.remark" clearable placeholder="请输入填报人" />
<el-input v-model="filluser" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报日期" prop="plan_id" :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 class="flex-1 !flex" v-model="filluserdate" clearable type="date" value-format="YYYY-MM-DD " disabled placeholder="系统自动填写">
</el-date-picker>
</el-form-item>
</el-col>
@ -168,7 +172,7 @@
</el-dialog>
<el-dialog v-model="showDialog2" title="选择项目" width="70%">
<el-dialog v-model="showDialog2" title="选择施工计划" width="70%">
<buildplanDialog @customEvent="customEvent2"></buildplanDialog>
</el-dialog>
<personnelselector ref="personnel" @confirm="submituser" type="1"></personnelselector>
@ -194,6 +198,9 @@ import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import type { PropType } from 'vue'
import feedback from '@/utils/feedback'
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
const userInfo = useUserStore().userInfo
const project_name = ref('')
const project_code = ref('')
const plan_start_date = ref('')
@ -208,10 +215,12 @@ const unit = ref('')
const today_workload = ref('')
const zy_code = ref('')
const price = ref(0)
const residue_workload = ref('')
const project_id = ref(0)
const quality_control_points = ref('')
const process_file = ref([])
const filluser = userInfo.name
const filluserdate = timeFormat(new Date(), 'yyyy-mm-dd hh:MM:ss')
const personnel = ref<any>()
const num = ref(0)
defineProps({
@ -241,8 +250,13 @@ const customEvent2 = (e: any) => {
process_step_no.value = e.process_step_no
process_step.value = e.process_step
quality_control_points.value = e.quality_control_points
residue_workload.value = e.residue_workload
if (e.file && e.file.length > 0) {
process_file.value = e.file
}
showDialog2.value = false;
};
const customEvent = (e: any) => {
tableData.value[num.value].name1 = e.name
@ -339,7 +353,7 @@ const setFormData = async (data: Record<any, any>) => {
process_step_no.value = data.process_step_no
process_step.value = data.process_step
quality_control_points.value = data.quality_control_points
residue_workload.value = data.residue_workload
}

View File

@ -35,7 +35,7 @@
<el-table-column type="selection" width="55" />
<el-table-column label="处理流程" prop="sort" show-overflow-tooltip />
<el-table-column label="施工汇报单号" prop="sort" show-overflow-tooltip />
<el-table-column label="施工汇报单号" prop="report_code" show-overflow-tooltip />
<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 />

View File

@ -4,31 +4,17 @@
<el-page-header content="编辑数据表" @back="$router.back()" />
</el-card>
<el-card class="mt-4 !border-none" shadow="never">
<el-form
ref="formRef"
class="ls-form"
:model="formData"
label-width="100px"
:rules="rules"
>
<el-form ref="formRef" class="ls-form" :model="formData" label-width="100px" :rules="rules">
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息" name="base">
<el-form-item label="表名称" prop="table_name">
<div class="w-80">
<el-input
v-model="formData.table_name"
placeholder="请输入表名称"
clearable
/>
<el-input v-model="formData.table_name" placeholder="请输入表名称" clearable />
</div>
</el-form-item>
<el-form-item label="表描述" prop="table_comment">
<div class="w-80">
<el-input
v-model="formData.table_comment"
placeholder="请输入表描述"
clearable
/>
<el-input v-model="formData.table_comment" placeholder="请输入表描述" clearable />
</div>
</el-form-item>
<el-form-item label="作者">
@ -38,15 +24,7 @@
</el-form-item>
<el-form-item label="备注">
<div class="w-80">
<el-input
v-model="formData.remark"
class="w-full"
type="textarea"
:autosize="{ minRows: 4, maxRows: 4 }"
maxlength="200"
show-word-limit
clearable
/>
<el-input v-model="formData.remark" class="w-full" type="textarea" :autosize="{ minRows: 4, maxRows: 4 }" maxlength="200" show-word-limit clearable />
</div>
</el-form-item>
</el-tab-pane>
@ -61,47 +39,27 @@
<el-table-column label="物理类型" prop="column_type" />
<el-table-column label="必填" width="80">
<template v-slot="{ row }">
<el-checkbox
v-model="row.is_required"
:true-label="1"
:false-label="0"
/>
<el-checkbox v-model="row.is_required" :true-label="1" :false-label="0" />
</template>
</el-table-column>
<el-table-column label="插入" width="80">
<template v-slot="{ row }">
<el-checkbox
v-model="row.is_insert"
:true-label="1"
:false-label="0"
/>
<el-checkbox v-model="row.is_insert" :true-label="1" :false-label="0" />
</template>
</el-table-column>
<el-table-column label="编辑" width="80">
<template v-slot="{ row }">
<el-checkbox
v-model="row.is_update"
:true-label="1"
:false-label="0"
/>
<el-checkbox v-model="row.is_update" :true-label="1" :false-label="0" />
</template>
</el-table-column>
<el-table-column label="列表" width="80">
<template v-slot="{ row }">
<el-checkbox
v-model="row.is_lists"
:true-label="1"
:false-label="0"
/>
<el-checkbox v-model="row.is_lists" :true-label="1" :false-label="0" />
</template>
</el-table-column>
<el-table-column label="查询" width="80">
<template v-slot="{ row }">
<el-checkbox
v-model="row.is_query"
:true-label="1"
:false-label="0"
/>
<el-checkbox v-model="row.is_query" :true-label="1" :false-label="0" />
</template>
</el-table-column>
<el-table-column label="查询方式">
@ -134,25 +92,13 @@
</el-table-column>
<el-table-column label="字典类型" min-width="120">
<template v-slot="{ row }">
<el-select
v-model="row.dict_type"
clearable
:disabled="
!(
row.view_type == 'select' ||
row.view_type == 'radio' ||
row.view_type == 'checkbox'
)
"
placeholder="字典类型"
>
<el-option
v-for="(item, index) in optionsData.dict_type"
:key="index"
:label="item.name"
:value="item.type"
:disabled="!item.status"
/>
<el-select v-model="row.dict_type" clearable :disabled="!(
row.view_type == 'select' ||
row.view_type == 'radio' ||
row.view_type == 'checkbox'
)
" placeholder="字典类型">
<el-option v-for="(item, index) in optionsData.dict_type" :key="index" :label="item.name" :value="item.type" :disabled="!item.status" />
</el-select>
</template>
</el-table-column>
@ -171,74 +117,38 @@
<el-radio :label="1">软删除</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="删除字段"
prop="delete.name"
v-if="formData.delete.type == 1"
>
<el-form-item label="删除字段" prop="delete.name" v-if="formData.delete.type == 1">
<el-select class="w-80" v-model="formData.delete.name" clearable>
<el-option
v-for="item in formData.table_column"
:key="item.id"
:value="item.column_name"
:label="`${item.column_name}${item.column_comment}`"
/>
<el-option v-for="item in formData.table_column" :key="item.id" :value="item.column_name" :label="`${item.column_name}${item.column_comment}`" />
</el-select>
</el-form-item>
<template v-if="formData.template_type == 1">
<el-form-item label="树表ID" prop="treePrimary">
<div>
<el-select
class="w-80"
v-model="formData.tree.tree_id"
clearable
>
<el-option
v-for="item in formData.table_column"
:key="item.id"
:value="item.column_name"
:label="`${item.column_name}${item.column_comment}`"
/>
<el-select class="w-80" v-model="formData.tree.tree_id" clearable>
<el-option v-for="item in formData.table_column" :key="item.id" :value="item.column_name" :label="`${item.column_name}${item.column_comment}`" />
</el-select>
<div class="form-tips">指定树表的主要ID一般为主键</div>
</div>
</el-form-item>
<el-form-item label="树表父ID" prop="treeParent">
<div>
<el-select
class="w-80"
v-model="formData.tree.tree_pid"
clearable
>
<el-option
v-for="item in formData.table_column"
:key="item.id"
:value="item.column_name"
:label="`${item.column_name}${item.column_comment}`"
/>
<el-select class="w-80" v-model="formData.tree.tree_pid" clearable>
<el-option v-for="item in formData.table_column" :key="item.id" :value="item.column_name" :label="`${item.column_name}${item.column_comment}`" />
</el-select>
<div class="form-tips">指定树表的父ID比如parent_id</div>
</div>
</el-form-item>
<el-form-item label="树名称" prop="treeName">
<el-select class="w-80" v-model="formData.tree.tree_name" clearable>
<el-option
v-for="item in formData.table_column"
:key="item.id"
:value="item.column_name"
:label="`${item.column_name}${item.column_comment}`"
/>
<el-option v-for="item in formData.table_column" :key="item.id" :value="item.column_name" :label="`${item.column_name}${item.column_comment}`" />
</el-select>
</el-form-item>
</template>
<el-form-item label="类描述">
<div class="w-80">
<div>
<el-input
v-model="formData.class_comment"
placeholder="请输入文件描述"
clearable
/>
<el-input v-model="formData.class_comment" placeholder="请输入文件描述" clearable />
</div>
<div class="form-tips">
<div>
@ -256,22 +166,14 @@
</el-form-item>
<el-form-item label="模块名" prop="module_name">
<div class="w-80">
<el-input
v-model="formData.module_name"
placeholder="请输入模块名"
clearable
/>
<el-input v-model="formData.module_name" placeholder="请输入模块名" clearable />
<div class="form-tips">生成文件所在模块</div>
</div>
</el-form-item>
<el-form-item label="类目录">
<div class="w-80">
<div>
<el-input
v-model="formData.class_dir"
placeholder="请输入文件所在目录"
clearable
/>
<el-input v-model="formData.class_dir" placeholder="请输入文件所在目录" clearable />
</div>
<div class="form-tips">
<div>
@ -282,27 +184,13 @@
</el-form-item>
<el-form-item label="父级菜单" prop="menu.pid">
<el-tree-select
class="w-80"
v-model="formData.menu.pid"
:data="optionsData.menu"
clearable
node-key="id"
:props="{
label: 'name'
}"
default-expand-all
placeholder="请选择父级菜单"
check-strictly
/>
<el-tree-select class="w-80" v-model="formData.menu.pid" :data="optionsData.menu" clearable node-key="id" :props="{
label: 'name'
}" default-expand-all placeholder="请选择父级菜单" check-strictly />
</el-form-item>
<el-form-item label="菜单名称" prop="menu.name">
<div class="w-80">
<el-input
v-model="formData.menu.name"
placeholder="请输入菜单名称"
clearable
/>
<el-input v-model="formData.menu.name" placeholder="请输入菜单名称" clearable />
</div>
</el-form-item>
<el-form-item label="菜单构建" prop="menu.type" required>
@ -335,24 +223,16 @@
<el-table-column prop="model" label="关联模型" />
<el-table-column prop="local_key" label="关联键">
<template #default="{ row }">
<dict-value
:value="row.local_key"
:options="formData.table_column"
:config="{
label: 'column_comment',
value: 'column_name'
}"
/>
<dict-value :value="row.local_key" :options="formData.table_column" :config="{
label: 'column_comment',
value: 'column_name'
}" />
</template>
</el-table-column>
<el-table-column prop="foreign_key" label="外键" />
<el-table-column label="操作">
<template #default="{ row, $index }">
<el-button
link
type="primary"
@click="showEditPopup('edit', row, $index)"
>
<el-button link type="primary" @click="showEditPopup('edit', row, $index)">
编辑
</el-button>
<el-button link type="danger" @click="handelDelete($index)">
@ -361,15 +241,7 @@
</template>
</el-table-column>
</el-table>
<relations-add
:column="formData.table_column"
:types="relationTypes"
v-if="showEdit"
ref="editRef"
@add="handleAdd"
@edit="handleEdit"
@close="showEdit = false"
/>
<relations-add :column="formData.table_column" :types="relationTypes" v-if="showEdit" ref="editRef" @add="handleAdd" @edit="handleEdit" @close="showEdit = false" />
</div>
</el-tab-pane>
</el-tabs>

View File

@ -0,0 +1,93 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="提交人" prop="commitor">
<el-input class="w-[280px]" v-model="queryParams.commitor" clearable placeholder="请输入提交人" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input class="w-[280px]" v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="发票类型" prop="invoice_type">
<el-select class="w-[280px]" v-model="queryParams.invoice_type" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_type" :key="index" :label="item.name" :value="item.value" />
</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" show-overflow-tooltip />
<el-table-column label="合同编号" prop="contract_no" 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_code" show-overflow-tooltip />
<el-table-column label="签约日期" prop="contract_name" show-overflow-tooltip />
<el-table-column label="实际合同金额" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="已回款" prop="apply_date" show-overflow-tooltip />
<el-table-column label="已开票" prop="applier" show-overflow-tooltip />
<el-table-column label="开票未回款" prop="payment_amount" show-overflow-tooltip />
<el-table-column label="回款未开票" prop="invoice_amount" show-overflow-tooltip />
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { adminpaymentsLists, adminpaymentsDelete, adminpaymentsDetail } from '@/api/administrativePayments'
import { timeFormat } from '@/utils/util'
import feedback from '@/utils/feedback'
//
const queryParams = reactive({
commitor: '',
invoice_no: '',
invoice_type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: adminpaymentsLists,
params: queryParams
})
getLists()
</script>

View File

@ -0,0 +1,90 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="提交人" prop="commitor">
<el-input class="w-[280px]" v-model="queryParams.commitor" clearable placeholder="请输入提交人" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input class="w-[280px]" v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="发票类型" prop="invoice_type">
<el-select class="w-[280px]" v-model="queryParams.invoice_type" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_type" :key="index" :label="item.name" :value="item.value" />
</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" show-overflow-tooltip />
<el-table-column label="合同编号" prop="contract_code" 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="supplier_name" show-overflow-tooltip />
<el-table-column label="签订日期" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="实际合同金额" prop="apply_date" show-overflow-tooltip />
<el-table-column label="已付款金额" prop="applier" show-overflow-tooltip />
<el-table-column label="已开票金额" prop="payment_amount" show-overflow-tooltip />
<el-table-column label="收票未付款" prop="invoice_amount" show-overflow-tooltip />
<el-table-column label="付款未收票" prop="amount_excluding_tax" show-overflow-tooltip />
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { adminpaymentsLists, adminpaymentsDelete, adminpaymentsDetail } from '@/api/administrativePayments'
import { timeFormat } from '@/utils/util'
import feedback from '@/utils/feedback'
//
const queryParams = reactive({
commitor: '',
invoice_no: '',
invoice_type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: adminpaymentsLists,
params: queryParams
})
getLists()
</script>

View File

@ -1,129 +0,0 @@
<template>
<div>
<el-card>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px" label-position="left">
<el-form-item label="组织名称" prop="field101">
<el-input v-model="formData.field101" placeholder="请输入组织名称" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="部门名称" prop="field102">
<el-input v-model="formData.field102" placeholder="请输入部门名称" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="账户编码" prop="field103">
<el-input v-model="formData.field103" placeholder="系统自动填写" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="开户银行" prop="field104">
<el-input v-model="formData.field104" placeholder="请输入开户银行" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="开户名称" prop="field105">
<el-input v-model="formData.field105" placeholder="请输入开户名称" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="账号" prop="field106">
<el-input v-model="formData.field106" placeholder="请输入账号" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="开户日期" prop="field107">
<el-date-picker v-model="formData.field107" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:style="{ width: '100%' }" placeholder="请选择开户日期" clearable></el-date-picker>
</el-form-item>
<el-form-item label="期初金额" prop="field108">
<el-input v-model="formData.field108" placeholder="请输入期初金额" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="备注" prop="field109">
<el-input v-model="formData.field109" type="textarea" placeholder="请输入备注"
:autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
export default {
components: {},
props: [],
data() {
return {
formData: {
field101: undefined,
field102: undefined,
field103: undefined,
field104: undefined,
field105: undefined,
field106: undefined,
field107: null,
field108: undefined,
field109: undefined,
},
rules: {
field101: [{
required: true,
message: '请输入组织名称',
trigger: 'blur'
}],
field102: [{
required: true,
message: '请输入部门名称',
trigger: 'blur'
}],
field103: [{
required: true,
message: '系统自动填写',
trigger: 'blur'
}],
field104: [{
required: true,
message: '请输入开户银行',
trigger: 'blur'
}],
field105: [{
required: true,
message: '请输入开户名称',
trigger: 'blur'
}],
field106: [{
required: true,
message: '请输入账号',
trigger: 'blur'
}],
field107: [],
field108: [{
required: true,
message: '请输入期初金额',
trigger: 'blur'
}],
field109: [],
},
}
},
computed: {},
watch: {},
created() { },
mounted() { },
methods: {
submitForm() {
this.$refs['elForm'].validate(valid => {
if (!valid) return
// TODO
})
},
resetForm() {
this.$refs['elForm'].resetFields()
},
}
}
</script>
<style></style>

View File

@ -0,0 +1,185 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="合同名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采购分类">
<dict-value :options="dictData.contract_type" :value="formData.contract_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款方式">
<dict-value :options="dictData.pay_type" :value="formData.pay_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产申请单号">
{{ formData.asset_apply_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开始日期">
{{ formData.start_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束日期">
{{ formData.end_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额">
{{ formData.amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额大写">
{{ formData.amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同主要条款">
{{ formData.main_content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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 formDataannex = reactive([])
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,209 @@
<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">
<el-row>
<el-col :span="8">
<el-form-item label="组织" prop="org_id" @click="showDialog = true">
<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>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="部门" prop="dept_id" @click="showDialog = true">
<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-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账户编码" prop="contract_name">
<el-input v-model="formData.contract_name" disabled clearable 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 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 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 placeholder="请输入账号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="开户日期" prop="start_date">
<el-date-picker class="flex-1 !flex" 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="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入期初金额" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiadministrativeAdd, apiadministrativeEdit, apiadministrativeDetail } from '@/api/administrative'
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 list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import feedback from '@/utils/feedback'
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑行政合同' : '新增行政合同'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: '',
supplier_id: 0,
contract_no: "",
contract_name: "",
procurement_type: 0,
asset_apply_no: "",
start_date: "",
end_date: "",
signing_date: "",
pay_type: '',
amount: '',
amount_daxie: "",
main_content: "",
remark: "",
annex: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.dept_id) {
getlist1(data.dept_id)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiadministrativeDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiadministrativeEdit(data)
: await apiadministrativeAdd(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,156 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="contract_no">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="contract_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="资产申请单号" prop="asset_apply_no">
<el-input class="w-[280px]" v-model="queryParams.asset_apply_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="采购分类" prop="procurement_type">
<el-select class="w-[280px]" v-model="queryParams.procurement_type" clearable placeholder="项目">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in protype" :key="index" :label="item.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="['administrativeContracts.administrativeContracts/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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=" 组织名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label=" 部门名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label="账户编码" prop="custom_name" show-overflow-tooltip />
<el-table-column label=" 开户银行" prop="contract_name" show-overflow-tooltip />
<el-table-column label="开户名称" prop="contract_no" show-overflow-tooltip />
<el-table-column label="账号" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="开户日期" prop="supplier_code" show-overflow-tooltip />
<el-table-column label="期初金额" prop="amount" show-overflow-tooltip />
<el-table-column label="入账金额" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="出账金额" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="账户余额" prop="retention_money" show-overflow-tooltip />
<el-table-column label="账户资金余额" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="汇票账户余额" prop="retention_money" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['administrativeContracts.administrativeContracts/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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 { apiadministrativeLists, apiadministrativeDelete, apiadministrativeDetail } from '@/api/administrative'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
contract_no: '',
contract_name: '',
procurement_type: '',
asset_apply_no: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('procurement_contract_type,pay_type,account_period,pay_period,procurement_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiadministrativeLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apiadministrativeDetail({ 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 apiadministrativeDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apiadministrativeDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -1,72 +0,0 @@
<template>
<div>
<el-card>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px" label-position="left">
<el-form-item label="开始生效日期" prop="field101">
<el-date-picker v-model="formData.field101" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:style="{ width: '100%' }" placeholder="请选择" clearable></el-date-picker>
</el-form-item>
<el-form-item label="年化利率(%)" prop="field102">
<el-date-picker v-model="formData.field102" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:style="{ width: '100%' }" placeholder="请选择年化利率(%)" clearable></el-date-picker>
</el-form-item>
<el-form-item label="备注" prop="field104">
<el-input v-model="formData.field104" type="textarea" placeholder="请输入备注"
:autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
export default {
components: {},
props: [],
data() {
return {
formData: {
field101: null,
field102: null,
field104: undefined,
},
rules: {
field101: [{
required: true,
message: '请选择',
trigger: 'change'
}],
field102: [{
required: true,
message: '请选择年化利率(%)',
trigger: 'change'
}],
field104: [],
},
}
},
computed: {},
watch: {},
created() { },
mounted() { },
methods: {
submitForm() {
this.$refs['elForm'].validate(valid => {
if (!valid) return
// TODO
})
},
resetForm() {
this.$refs['elForm'].resetFields()
},
}
}
</script>
<style></style>

View File

@ -0,0 +1,185 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="合同名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采购分类">
<dict-value :options="dictData.contract_type" :value="formData.contract_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款方式">
<dict-value :options="dictData.pay_type" :value="formData.pay_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产申请单号">
{{ formData.asset_apply_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开始日期">
{{ formData.start_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束日期">
{{ formData.end_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额">
{{ formData.amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额大写">
{{ formData.amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同主要条款">
{{ formData.main_content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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 formDataannex = reactive([])
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,155 @@
<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">
<el-row>
<el-col :span="8">
<el-form-item label="开始生效日期" prop="start_date">
<el-date-picker class="flex-1 !flex" 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="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入年化利率()" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiadministrativeAdd, apiadministrativeEdit, apiadministrativeDetail } from '@/api/administrative'
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')
import feedback from '@/utils/feedback'
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑银行账户表' : '新增银行账户表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: '',
supplier_id: 0,
contract_no: "",
contract_name: "",
procurement_type: 0,
asset_apply_no: "",
start_date: "",
end_date: "",
signing_date: "",
pay_type: '',
amount: '',
amount_daxie: "",
main_content: "",
remark: "",
annex: ""
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.dept_id) {
getlist1(data.dept_id)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiadministrativeDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiadministrativeEdit(data)
: await apiadministrativeAdd(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,169 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="contract_no">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="contract_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="资产申请单号" prop="asset_apply_no">
<el-input class="w-[280px]" v-model="queryParams.asset_apply_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="采购分类" prop="procurement_type">
<el-select class="w-[280px]" v-model="queryParams.procurement_type" clearable placeholder="项目">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in protype" :key="index" :label="item.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="['administrativeContracts.administrativeContracts/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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="处理流程" prop="custom_name" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="custom_name" show-overflow-tooltip />
<el-table-column label="流程编号" prop="custom_name" show-overflow-tooltip />
<el-table-column label="合同名称" prop="contract_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="contract_no" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="supplier_code" show-overflow-tooltip />
<el-table-column label="合同金额" prop="amount" show-overflow-tooltip />
<el-table-column label="资产申请单号" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="采购分类" prop="contract_type">
<template #default="{ row }">
<dict-value :options="dictData.procurement_contract_type" :value="row.contract_type" />
</template>
</el-table-column>
<el-table-column label="签约日期" prop="signing_date">
<template #default="{ row }">
<span>{{ row.signing_date ? timeFormat(row.signing_date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
</template>
</el-table-column>
<el-table-column label="已付款" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="未付款" prop="retention_money" show-overflow-tooltip />
<el-table-column label="已开票" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="未开票" prop="retention_money" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['administrativeContracts.administrativeContracts/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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 { apiadministrativeLists, apiadministrativeDelete, apiadministrativeDetail } from '@/api/administrative'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
contract_no: '',
contract_name: '',
procurement_type: '',
asset_apply_no: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('procurement_contract_type,pay_type,account_period,pay_period,procurement_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiadministrativeLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apiadministrativeDetail({ 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 apiadministrativeDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apiadministrativeDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -1,147 +0,0 @@
<template>
<div>
<el-card>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px" label-position="left">
<el-form-item label="单据类型" prop="field101">
<el-input v-model="formData.field101" placeholder="收支流水调整单" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="账户编码" prop="field102">
<el-input v-model="formData.field102" placeholder="点击选择调整的账户" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="银行" prop="field103">
<el-input v-model="formData.field103" placeholder="系统自动填写" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="账号" prop="field104">
<el-input v-model="formData.field104" placeholder="系统自动填写" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="日期" prop="field105">
<el-date-picker v-model="formData.field105" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:style="{ width: '100%' }" placeholder="请选择日期" clearable :disabled='true'></el-date-picker>
</el-form-item>
<el-form-item label="经办人" prop="field106">
<el-input v-model="formData.field106" placeholder="请输入经办人" :disabled='true' clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="金额" prop="field107">
<el-input v-model="formData.field107" placeholder="可正可负(正数代表收入,负数代表支出)" clearable
:style="{ width: '100%' }"></el-input>
</el-form-item>
<el-form-item label="是否生成凭证" prop="field108">
<el-radio-group v-model="formData.field108" size="medium">
<el-radio v-for="(item, index) in field108Options" :key="index" :label="item.value"
:disabled="item.disabled">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="凭证编号" prop="field109">
<el-input v-model="formData.field109" placeholder="请输入凭证编号" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="备注" prop="field110">
<el-input v-model="formData.field110" placeholder="请输入备注" clearable :style="{ width: '100%' }">
</el-input>
</el-form-item>
<el-form-item label="附件" prop="field111">
<el-upload ref="field111" :file-list="field111fileList" :action="field111Action"
:before-upload="field111BeforeUpload">
<el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
</el-upload>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
export default {
components: {},
props: [],
data() {
return {
formData: {
field101: undefined,
field102: undefined,
field103: undefined,
field104: undefined,
field105: null,
field106: undefined,
field107: undefined,
field108: undefined,
field109: undefined,
field110: undefined,
field111: null,
},
rules: {
field101: [{
required: true,
message: '收支流水调整单',
trigger: 'blur'
}],
field102: [{
required: true,
message: '点击选择调整的账户',
trigger: 'blur'
}],
field103: [],
field104: [],
field105: [],
field106: [],
field107: [{
required: true,
message: '可正可负(正数代表收入,负数代表支出)',
trigger: 'blur'
}],
field108: [],
field109: [],
field110: [],
},
field111Action: 'https://jsonplaceholder.typicode.com/posts/',
field111fileList: [],
field108Options: [{
"label": "是",
"value": 1
}, {
"label": "否",
"value": 2
}],
}
},
computed: {},
watch: {},
created() { },
mounted() { },
methods: {
submitForm() {
this.$refs['elForm'].validate(valid => {
if (!valid) return
// TODO
})
},
resetForm() {
this.$refs['elForm'].resetFields()
},
field111BeforeUpload(file) {
let isRightSize = file.size / 1024 / 1024 < 2
if (!isRightSize) {
this.$message.error('文件大小超过 2MB')
}
return isRightSize
},
}
}
</script>
<style>
.el-upload__tip {
line-height: 1.2;
}
</style>

View File

@ -0,0 +1,185 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="合同名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商名称">
{{ formData.contract_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商编号">
{{ formData.contract_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采购分类">
<dict-value :options="dictData.contract_type" :value="formData.contract_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款方式">
<dict-value :options="dictData.pay_type" :value="formData.pay_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产申请单号">
{{ formData.asset_apply_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开始日期">
{{ formData.start_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束日期">
{{ formData.end_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额">
{{ formData.amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同金额大写">
{{ formData.amount_daxie }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同主要条款">
{{ formData.main_content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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 formDataannex = reactive([])
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,299 @@
<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">
<el-row>
<el-col :span="8">
<el-form-item label="单据类型" prop="supplier_id" @click="showDialog = true">
<el-input v-model="supplier_contract_name" readonly clearable placeholder="请选择供应商" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="账户编码" prop="supplier_id" @click="showDialog = true">
<el-input v-model="supplier_contract_name" readonly clearable placeholder="请选择供应商" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="银行" prop="supplier_id">
<el-input v-model="supplier_contract_no" disabled clearable placeholder="系统自动填写" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="账号" prop="contract_name">
<el-input v-model="formData.contract_name" clearable 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 placeholder="请输入供应商合同号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="日期" prop="start_date">
<el-date-picker class="flex-1 !flex" 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="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入经办人" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="金额" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable placeholder="请输入金额" />
</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="main_content">
<el-input v-model="formData.main_content" clearable placeholder="请输入凭证编号" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-form>
</popup>
<el-dialog v-model="showDialog" title="选择供应商" width="70%">
<supplierTable @customEvent="customEvent"></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 { toChinesNum } from "@/utils/util";
import supplierTable from '@/components/supplier/index.vue'
import { apiadministrativeAdd, apiadministrativeEdit, apiadministrativeDetail } from '@/api/administrative'
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 supplier_contract_name = ref('')
const supplier_contract_no = ref('')
const formDataannex = reactive([])
const tableData = reactive([])
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
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 amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑收支流水表' : '新增收支流水表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: '',
supplier_id: 0,
contract_no: "",
contract_name: "",
procurement_type: 0,
asset_apply_no: "",
start_date: "",
end_date: "",
signing_date: "",
pay_type: '',
amount: '',
amount_daxie: "",
main_content: "",
remark: "",
annex: ""
})
const customEvent = (e: any) => {
supplier_contract_name.value = e.supplier_name
formData.supplier_id = e.id
supplier_contract_no.value = e.supplier_code
showDialog.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.dept_id)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.amount_daxie) {
amountinput(data.amount_daxie)
}
//@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 apiadministrativeDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiadministrativeEdit(data)
: await apiadministrativeAdd(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,169 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="contract_no">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="contract_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="资产申请单号" prop="asset_apply_no">
<el-input class="w-[280px]" v-model="queryParams.asset_apply_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="采购分类" prop="procurement_type">
<el-select class="w-[280px]" v-model="queryParams.procurement_type" clearable placeholder="项目">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in protype" :key="index" :label="item.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="['administrativeContracts.administrativeContracts/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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" show-overflow-tooltip />
<el-table-column label="组织名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label=" 部门名称" prop="custom_name" show-overflow-tooltip />
<el-table-column label="单据类型" prop="contract_name" show-overflow-tooltip >
<template #default="{ row }">
<dict-value :options="dictData.procurement_contract_type" :value="row.contract_type" />
</template>
</el-table-column>
<el-table-column label="单据编号" prop="contract_no" show-overflow-tooltip />
<el-table-column label="合同类型" prop="contract_type">
<template #default="{ row }">
<dict-value :options="dictData.procurement_contract_type" :value="row.contract_type" />
</template>
</el-table-column>
<el-table-column label="合同编号" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="合同名称" prop="supplier_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="amount" show-overflow-tooltip />
<el-table-column label="项目编码" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="账户编码" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="银行" prop="retention_money" show-overflow-tooltip />
<el-table-column label="日期" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="开始计息日期" prop="retention_money" 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="创建日期" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['administrativeContracts.administrativeContracts/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['administrativeContracts.administrativeContracts/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 { apiadministrativeLists, apiadministrativeDelete, apiadministrativeDetail } from '@/api/administrative'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
contract_no: '',
contract_name: '',
procurement_type: '',
asset_apply_no: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('procurement_contract_type,pay_type,account_period,pay_period,procurement_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiadministrativeLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apiadministrativeDetail({ 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 apiadministrativeDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apiadministrativeDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -19,14 +19,14 @@
</el-select></el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<el-input v-model="supplier_name" readonly clearable placeholder="请输入供应商名称" />
<el-form-item label="供应商名称" prop="supplier_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<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">
<el-input v-model="supplier_code" readonly clearable placeholder="请输入供应商编码 " />
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>

View File

@ -6,13 +6,13 @@
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-form-item label="供应商名称" prop="supplier_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="supplier_name" clearable readonly placeholder="请选择供应商" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商编码" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-input v-model="supplier_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>

View File

@ -13,13 +13,13 @@
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" clearable placeholder="请选择客户" />
<el-form-item label="供应商名称" prop="supplier_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<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: 'blur' }]">
<el-input v-model="custom_name" clearable placeholder="请选择客户" />
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
@ -206,6 +206,8 @@ const formDataannex = reactive([])
const contract_name = ref('')
const project_name = ref('')
const project_code = ref('')
const supplier_name = ref('')
const supplier_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
@ -271,7 +273,9 @@ const showDialog1 = ref(false)
const showDialog2 = ref(false)
const customEvent = (e: any) => {
formData.supplier_id = e.id;
custom_name.value = e.name;
supplier_code.value = e.supplier_code
supplier_name.value = e.supplier_name
showDialog.value = false;
};
const customEvent1 = (e: any) => {

View File

@ -14,29 +14,29 @@
<el-row>
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.supplier_id" clearable placeholder="请输入供应商id" />
<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: 'blur' }]">
<el-input v-model="formData.supplier_id" clearable placeholder="请输入供应商id" />
<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: 'blur' }]">
<el-input v-model="project_name" readonly clearable placeholder="请输入项目id" />
<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: 'blur' }]">
<el-input v-model="project_code" readonly clearable placeholder="请输入项目id" />
<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 placeholder="请输入合同编号" />
<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="请输入供应商合同号" />
@ -242,6 +242,8 @@ 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'
@ -365,7 +367,9 @@ const customEvent = (e: any) => {
};
const customEvent1 = (e: any) => {
formData.supplier_id = e.id;
supplier_code.value = e.supplier_code
supplier_name.value = e.supplier_name
showDialog1.value = false;
};

View File

@ -2,12 +2,14 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline label-width="auto">
<el-form-item label="供应商id" prop="supplier_id">
<el-input class="w-[280px]" v-model="queryParams.supplier_id" clearable placeholder="请输入供应商id" />
<el-form-item label="供应商" prop="supplier_id">
<el-select v-model="queryParams.supplier_id" clearable placeholder="请选择供应商">
<el-option v-for="(item, index) in supplierList" :key="index" :label="item.supplier_name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
<el-form-item label="项目" prop="project_id">
<el-select v-model="queryParams.project_id" clearable placeholder="请选择项目">
<el-option v-for="(item, index) in projects" :key="index" :label="item.name" :value="parseInt(item.id)" />
<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="project_id">
@ -101,15 +103,16 @@ import { apiProcurementContractLists, apiProcurementContractDelete, apiProcureme
import { timeFormat } from '@/utils/util'
import feedback from '@/utils/feedback'
import { apiProjectLists } from '@/api/project'
import { apisupplierLists } from '@/api/suppler_list'
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 projects = ref([])
const projectList = ref([])
const supplierList = ref([])
//
const queryParams = reactive({
supplier_id: '',
@ -164,14 +167,22 @@ const handleDetail = async (data: any) => {
detailRef.value?.setFormData(res)
}
//
//
const projectList = async () => {
let res = await apiProjectLists()
projects.value = res.lists
const projectlist = async () => {
let res = await apiProjectLists({ page_no: 1, page_size: 9999 })
projectList.value = res.lists
}
projectList()
//
const supplierlist = async () => {
let res = await apisupplierLists({ page_no: 1, page_size: 9999 })
supplierList.value = res.lists
}
projectlist()
supplierlist()
getLists()
</script>

View File

@ -27,17 +27,30 @@
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="采购合同id" prop="procurement_contract_id" show-overflow-tooltip />
<el-table-column label="材料采购申请id" prop="material_procurement_application_id" show-overflow-tooltip />
<el-table-column label="数量" prop="num" show-overflow-tooltip />
<el-table-column label="含税单价" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="序号" type="index" width="55" 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="contract_code" show-overflow-tooltip />
<el-table-column label="供应商合同号" prop="num" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="合同类型" prop="contract_type">
<template #default="{ row }">
<dict-value :options="dictData.procurement_contract_type" :value="row.contract_type" />
</template>
</el-table-column>
<el-table-column label="税率" prop="tax_rate">
<template #default="{ row }">
<dict-value :options="dictData.tax_rate" :value="row.tax_rate" />
</template>
</el-table-column>
<el-table-column label="不含税金额" prop="amount_excluding_tax" show-overflow-tooltip />
<el-table-column label="含税金额" prop="amount_including_tax" show-overflow-tooltip />
<el-table-column label="材料类别" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="材料中类" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="材料小类" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="材料名称" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="材料编码" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="规格型号" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="品牌" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="参数说明" prop="unit_price_including_tax" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['procurement_contract_detail/edit']" type="primary" link @click="handleEdit(row)">
@ -93,7 +106,7 @@ const handleSelectionChange = (val: any[]) => {
}
//
const { dictData } = useDictData('tax_rate')
const { dictData } = useDictData('tax_rate,procurement_contract_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({

View File

@ -0,0 +1,131 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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" show-overflow-tooltip />
<el-table-column label="ID" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="项目名称" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="项目编码" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="合同名称" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="分项工程" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="子目名称" prop="due_date" show-overflow-tooltip />
<el-table-column label="项目特征" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="单位" prop="insurance" show-overflow-tooltip />
<el-table-column label="合同量" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="预算调整数量" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="预算调整后数量" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="单价" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="金额" prop="insurance_detail" 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 }">
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
//
const showDtail = ref(false)
//
const queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await insurancemanagementDelete({ id })
getLists()
}
getLists()
</script>

View File

@ -0,0 +1,334 @@
<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-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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" 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="year" value-format="YYYY" placeholder="选择年份">
</el-date-picker>
</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="month" value-format="MM" placeholder="选择月份">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="产值合计" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入产值合计" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款计划比例(%" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled 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="选择计划回款日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="是否生成回款计划" prop="insurance_date">
<el-switch v-model="value3" inline-prompt active-text="是" inactive-text="否" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款负责人" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入回款负责人" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑保险管理' : '新增保险管理'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,163 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="产值汇报单号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="项目名称" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="合同名称" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="分项工程" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="子目名称" prop="due_date" show-overflow-tooltip />
<el-table-column label="项目特征" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="单位" prop="insurance" show-overflow-tooltip />
<el-table-column label="合同量" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="已完工量" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="本月完工量" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="单价" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="本月产值" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="总进度()" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,334 @@
<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-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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" 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="year" value-format="YYYY" placeholder="选择年份">
</el-date-picker>
</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="month" value-format="MM" placeholder="选择月份">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="产值合计" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入产值合计" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款计划比例(%" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled 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="选择计划回款日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="是否生成回款计划" prop="insurance_date">
<el-switch v-model="value3" inline-prompt active-text="是" inactive-text="否" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款负责人" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入回款负责人" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑保险管理' : '新增保险管理'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,174 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label=" 产值汇报单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="月" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="产值" prop="due_date" show-overflow-tooltip />
<el-table-column label="是否生成回款计划" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="回款计划比例" prop="insurance" show-overflow-tooltip />
<el-table-column label="计划回款日期" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="开户银行" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="回款责任人" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,334 @@
<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-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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" 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="year" value-format="YYYY" placeholder="选择年份">
</el-date-picker>
</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="month" value-format="MM" placeholder="选择月份">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="产值合计" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入产值合计" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款计划比例(%" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled 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="选择计划回款日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="是否生成回款计划" prop="insurance_date">
<el-switch v-model="value3" inline-prompt active-text="是" inactive-text="否" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="回款负责人" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入回款负责人" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑保险管理' : '新增保险管理'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

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="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="组织名称" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="部门名称" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="预警分类" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="状态" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="处理人" prop="due_date" show-overflow-tooltip />
<el-table-column label="处理日期" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="添加人" prop="insurance" show-overflow-tooltip />
<el-table-column label="创建日期" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="更新人" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="更新日期" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="负责人" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -53,11 +53,7 @@
{{ formData.work_record_num }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日工资">
{{ formData.daily_salary

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,277 @@
<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-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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<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="请输入项目经理" @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-form-item> </el-col>
<el-col :span="8">
<el-form-item label="出差起始地" prop="project_id">
<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_name" 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="选择出差时间">
</el-date-picker>
</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="选择结束时间">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="出差事由" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入出差事由" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="历时天数" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入历时天数" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑出差申请' : '新增出差申请'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,174 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="申请单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="出差事由" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="出差时间" prop="due_date" show-overflow-tooltip />
<el-table-column label="出差起始地" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="出差目的地" prop="insurance" show-overflow-tooltip />
<el-table-column label="交通工具" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="结束时间" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="历时天数" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,248 @@
<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" 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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" 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="选择调整日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="调整金额" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入调整金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑保险管理' : '新增保险管理'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,165 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="ID" prop="id" show-overflow-tooltip />
<el-table-column label="项目名称" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="项目编码" prop="person_idcard" show-overflow-tooltip />
<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="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,450 @@
<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" 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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<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="请输入项目经理" @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-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额(元)" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入合计金额(元)" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额大写(元)" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled placeholder="请输入合计金额大写(元)" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="报销类型" prop="insurance_date">
<el-radio-group v-model="formData.insurance_date" 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="8">
<el-form-item label="借款单单号" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入借款单单号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="借款金额(未还)" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入借款金额(未还)" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="本次冲抵借款金额" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入本次冲抵借款金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="付款金额" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入付款金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="报销人" prop="handler">
<el-input v-model="formData.handler" 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="选择报销日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款人姓名" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款人姓名" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款银行" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款账号" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款账号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" />
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-bottom: 30px;">发票明细</div>
<div style="margin-bottom: 30px;">
<el-table :data="tablist2">
<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="invoice_type">
<template #default="{ row }">
<el-select v-model="row.invoice_type" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_type" :key="index" :label="item.name" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="发票号" prop="invoice_sn">
<template #default="{ row }">
<el-input v-model="row.invoice_sn" />
</template></el-table-column>
<el-table-column label="发票税率" prop="tax_rate">
<template #default="{ row }">
<el-select v-model="row.tax_rate" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.tax_rate" :key="index" :label="item.name" :value="item.value" />
</el-select> </template>
</el-table-column>
<el-table-column label="发票形式" prop="invoice_form">
<template #default="{ row }">
<el-select v-model="row.invoice_form" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_form" :key="index" :label="item.name" :value="item.value" />
</el-select> </template>
</el-table-column>
<el-table-column label="发票金额" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" /> </template>
</el-table-column>
<el-table-column label="发票税额" prop="tax">
<template #default="{ row }">
<el-input v-model="row.tax" /> </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">{{ item }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(row, index)">x</span>
</div>
</div>
</div>
</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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
const tablist2 = reactive([{}])
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 handleAvatarSuccess_four1 = (index, response, file, fileList) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
if (!tablist2[index].annex) {
tablist2[index].annex = []; // annex
}
console.log(tablist2[index], index, tablist2)
// console.log(index, response)
tablist2[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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑差旅报销' : '新增差旅报销'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,160 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="申请单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="报销总金额" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="报销类型" prop="due_date" show-overflow-tooltip />
<el-table-column label="借款单单号" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="借款金额" prop="insurance" show-overflow-tooltip />
<el-table-column label="本次冲抵借款金额" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="付款金额" prop="insurance_company" show-overflow-tooltip />
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,263 @@
<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" 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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="借款人" prop="insurance_date">
<el-input v-model="project_name" 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="选择借款申请日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="借款金额" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" placeholder="请输入借款金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款人姓名" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款人姓名" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款银行" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款账号" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款账号" />
</el-form-item> </el-col>
<el-col :span="24">
<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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑保险管理' : '新增保险管理'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

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="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="借款单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="收款账号" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="收款银行" prop="due_date" show-overflow-tooltip />
<el-table-column label="收款人姓名" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="借款金额" prop="insurance" show-overflow-tooltip />
<el-table-column label="已还款金额" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="未还款金额" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,450 @@
<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-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> </el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id">
<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="请输入项目经理" @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-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额(元)" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入合计金额(元)" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额大写(元)" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled placeholder="请输入合计金额大写(元)" />
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="报销类型" prop="insurance_date">
<el-radio-group v-model="formData.insurance_date" 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="8">
<el-form-item label="借款单单号" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入借款单单号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="借款金额(未还)" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入借款金额(未还)" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="本次冲抵借款金额" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入本次冲抵借款金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="付款金额" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入付款金额" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="报销人" prop="handler">
<el-input v-model="formData.handler" 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="选择报销日期">
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款人姓名" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款人姓名" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款银行" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="收款账号" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入收款账号" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="handler">
<el-input v-model="formData.handler" clearable placeholder="请输入备注" />
</el-form-item> </el-col>
<el-col :span="24">
<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-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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" />
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-bottom: 30px;">发票明细</div>
<div style="margin-bottom: 30px;">
<el-table :data="tablist2">
<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="invoice_type">
<template #default="{ row }">
<el-select v-model="row.invoice_type" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_type" :key="index" :label="item.name" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="发票号" prop="invoice_sn">
<template #default="{ row }">
<el-input v-model="row.invoice_sn" />
</template></el-table-column>
<el-table-column label="发票税率" prop="tax_rate">
<template #default="{ row }">
<el-select v-model="row.tax_rate" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.tax_rate" :key="index" :label="item.name" :value="item.value" />
</el-select> </template>
</el-table-column>
<el-table-column label="发票形式" prop="invoice_form">
<template #default="{ row }">
<el-select v-model="row.invoice_form" clearable placeholder="请选择发票类型">
<el-option v-for="(item, index) in dictData.invoice_form" :key="index" :label="item.name" :value="item.value" />
</el-select> </template>
</el-table-column>
<el-table-column label="发票金额" prop="amount">
<template #default="{ row }">
<el-input v-model="row.amount" /> </template>
</el-table-column>
<el-table-column label="发票税额" prop="tax">
<template #default="{ row }">
<el-input v-model="row.tax" /> </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">{{ item }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(row, index)">x</span>
</div>
</div>
</div>
</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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectDialog @customEvent="customEvent"></projectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择项目人员" width="70%">
<customDialog @customEvent="customEvent1" :project_id="formData.project_id"></customDialog>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="procurementContractEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
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 person_name = ref('')
const idcard = ref('')
const tablist2 = reactive([{}])
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
const userInfo = userStore.userInfo
//
const customEvent = (e) => {
formData.project_id = e.id
project_name.value = e.name
project_code.value = e.project_code
showDialog.value = false
}
const customEvent1 = (e) => {
formData.project_person_id = e.id
idcard.value = e.idcard
person_name.value = e.name
showDialog1.value = false
}
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 handleAvatarSuccess_four1 = (index, response, file, fileList) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
if (!tablist2[index].annex) {
tablist2[index].annex = []; // annex
}
console.log(tablist2[index], index, tablist2)
// console.log(index, response)
tablist2[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 popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑差旅报销' : '新增差旅报销'
})
//
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 delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
project_id: '',
project_person_id: '',
insurance_date: '',
due_date: '',
type: '',
insurance_no: '',
insurance: '',
insured_amount: '',
insurance_company: '',
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
//
const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
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]
}
}
project_name.value = data.project_name
project_code.value = data.project_code
idcard.value = data.person_idcard
person_name.value = data.person_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await insurancemanagementDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await insurancemanagementEdit(data)
: await insurancemanagementAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
formData.handler = userInfo.name
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,159 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="申请单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="报销总金额" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="报销类型" prop="due_date" show-overflow-tooltip />
<el-table-column label="借款单单号" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="借款金额" prop="insurance" show-overflow-tooltip />
<el-table-column label="本次冲抵借款金额" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="付款金额" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -38,12 +38,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>

View File

@ -1,75 +1,174 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="项目文档详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<popup ref="popupRef" title="项目人员详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编码">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.idcard
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工种">
<dict-value :options="dictData.work_type" :value="row.work_type" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="人工单价">
{{ formData.unit_price }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="身份证正面">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编码">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.idcard
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工种">
{{ formData.work_type_text }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="人工单价">
{{ formData.unit_price }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="身份证正面">
<div v-if="formData.idcard_front && formData.idcard_front.length > 0">
<material-picker v-model="formData.idcard_front" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="身份证反面">
<material-picker v-model="formData.idcard_backend" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="银行卡照片">
<material-picker v-model="formData.bank_card" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行卡号">
{{ formData.bank_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
</div>
<div v-else>暂无照片</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="身份证反面">
<div v-if="formData.idcard_backend && formData.idcard_backend.length > 0">
<material-picker v-model="formData.idcard_backend" />
</div>
<div v-else>暂无照片</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="银行卡照片">
<div v-if="formData.bank_card && formData.bank_card.length > 0">
<material-picker v-model="formData.bank_card" />
</div>
<div v-else>暂无照片</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行卡号">
{{ formData.bank_no }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户银行">
{{ formData.deposit_bank }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注">
{{ formData.remark }}
</el-form-item>
</el-col>
</el-row>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="劳动合同" name="first">
<el-table :data="laborContractsList">
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="合同状态" prop="contract_status_text" show-overflow-tooltip />
<el-table-column label="合同类别" prop="contract_type_text" show-overflow-tooltip />
<el-table-column label="合同名称" prop="contract_title_text" show-overflow-tooltip />
<el-table-column label="合同签定日期" prop="signing_date" show-overflow-tooltip />
<el-table-column label="起始时间" prop="start_date" show-overflow-tooltip />
<el-table-column label="终止时间" prop="end_date" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
</el-table>
</el-tab-pane>
<el-tab-pane label="保险记录" name="second">
<el-table :data="insurancesList">
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="投保日期" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="到期日期" prop="due_date" show-overflow-tooltip />
<el-table-column label="保险种类" prop="type" show-overflow-tooltip />
<el-table-column label="保单号" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="保费(元)" prop="insurance" show-overflow-tooltip />
<el-table-column label="投保金额(万元)" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="保险公司" prop="insurance_company" show-overflow-tooltip />
</el-table>
</el-tab-pane>
<el-tab-pane label="考勤明细" name="third">
<el-table :data="attendancesList">
<el-table-column label="日记工单号" prop="attendance_code" show-overflow-tooltip />
<el-table-column label="日期" prop="attendance_date" show-overflow-tooltip />
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="工种" prop="work_type_text" show-overflow-tooltip />
<el-table-column label="上班时间" prop="work_start_time" show-overflow-tooltip />
<el-table-column label="下班时间" prop="work_end_time" show-overflow-tooltip />
<el-table-column label="记工数量" prop="work_record_num" show-overflow-tooltip />
<el-table-column label="日工资" prop="daily_salary" show-overflow-tooltip />
<el-table-column label="日生活费" prop="daily_living" show-overflow-tooltip />
<el-table-column label="日补贴" prop="daily_subsidy" show-overflow-tooltip />
<el-table-column label="日其它" prop="daily_other" show-overflow-tooltip />
<el-table-column label="日收入" prop="daily_income" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
</el-table>
</el-tab-pane>
<el-tab-pane label="施工记录" name="fourth">
<el-table :data="buildworksList">
<el-table-column label="施工汇报单号" prop="report_code" show-overflow-tooltip />
<el-table-column label="作业编码" prop="zy_code" show-overflow-tooltip />
<el-table-column label="分项工程" prop="subentry_engineering" show-overflow-tooltip />
<el-table-column label="工序步骤" prop="process_step" show-overflow-tooltip />
<el-table-column label="日期" prop="report_date" show-overflow-tooltip />
<el-table-column label="姓名" prop="person_name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="工种" prop="work_type_text" show-overflow-tooltip />
<el-table-column label="完工量" prop="work_num" show-overflow-tooltip />
<el-table-column label="单位" prop="unit" show-overflow-tooltip />
<el-table-column label="单价" prop="price" show-overflow-tooltip />
<el-table-column label="金额" prop="amount" show-overflow-tooltip />
</el-table>
</el-tab-pane>
<el-tab-pane label="工资付款" name="six">
<el-table :data="buildworksList">
<el-table-column label="ID" prop="id" 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="name" show-overflow-tooltip />
<el-table-column label="身份证号" prop="idcard" show-overflow-tooltip />
<el-table-column label="工种" prop="work_type_text" show-overflow-tooltip />
<el-table-column label="总收入" prop="unit_price" show-overflow-tooltip />
<el-table-column label="总支出" prop="bank_no" show-overflow-tooltip />
<el-table-column label="未发放" prop="deposit_bank" show-overflow-tooltip />
<el-table-column label="本次付款金额" prop="remark" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
</el-table>
</el-tab-pane>
</el-tabs>
</el-row>
</el-card>
</el-form>
</popup>
</div>
@ -79,7 +178,7 @@
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { personnelbuildworks, personnelattendances, personneinsurances, personnelaborContracts } from '@/api/project_personnel'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
@ -91,28 +190,62 @@ defineProps({
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
import type { TabsPaneContext } from 'element-plus'
const formDataannex = reactive([])
const laborContractsList = ref([])
const insurancesList = ref([])
const attendancesList = ref([])
const buildworksList = ref([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
const activeName = ref('first')
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
//
const formData = reactive({
})
//
const laborContracts = async (id: any) => {
let res = await personnelaborContracts({ person_id: id, page_no: 1, page_size: 9999 })
laborContractsList.value = res.lists
}
//
const insurances = async (id: any) => {
let res = await personneinsurances({ person_id: id, page_no: 1, page_size: 9999 })
insurancesList.value = res.lists
}
//
const attendances = async (id: any) => {
let res = await personnelattendances({ person_id: id, page_no: 1, page_size: 9999 })
attendancesList.value = res.lists
}
//
const buildworks = async (id: any) => {
let res = await personnelbuildworks({ person_id: id, page_no: 1, page_size: 9999 })
buildworksList.value = res.lists
}
//
const setFormData = async (data: Record<any, any>) => {
laborContracts(data.id)
attendances(data.id)
insurances(data.id)
buildworks(data.id)
Object.assign(formData, data)
}
const getDetail = async (row: Record<string, any>) => {

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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

@ -13,9 +13,9 @@
</el-form-item> </el-col>
<el-col :span="24">
<el-form-item label="付款类型" prop="invoice_type">
<el-radio-group v-model="formData.invoice_type" placeholder="请选择付款类型">
<el-radio v-for="( item, index ) in dictData.invoice_type " :key="index" :label="parseInt(item.value)">
<el-form-item label="付款类型" prop="insurance_date">
<el-radio-group v-model="formData.insurance_date" placeholder="请选择付款类型">
<el-radio v-for="( item, index ) in dictData.pay_type " :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
@ -31,12 +31,12 @@
</el-date-picker>
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额(元)" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" placeholder="请输入合计金额(元)" />
<el-form-item label="合计金额(元)" prop="insurance">
<el-input v-model="formData.insurance" clearable type="number" @input="amountinput" placeholder="请输入合计金额(元)" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="合计金额大写(元)" prop="insured_amount">
<el-input v-model="formData.insured_amount" clearable placeholder="请输入合计金额大写(元))" />
<el-form-item label="合计金额大写(元)" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable disabled placeholder="请输入合计金额大写(元)" />
</el-form-item> </el-col>
<el-col :span="8">
@ -63,7 +63,7 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin-bottom: 30px;">付款计划</div>
<div style="margin-bottom: 30px;">工资支付明细</div>
<div style="margin-bottom: 30px;">
<el-table :data="formData.pay_plan">
<el-table-column label="序号">
@ -72,21 +72,35 @@
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="期次" prop="name1">
<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">
<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">
<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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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="pay_amount">
<template #default="{ row }"> <el-input v-model="row.pay_amount" /> </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" />
@ -109,6 +123,7 @@
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import projectDialog from '@/components/project/index.vue'
import { toChinesNum } from "@/utils/util";
import { insurancemanagementAdd, insurancemanagementEdit, insurancemanagementDetail } from '@/api/project_insurance_management'
import customDialog from '@/components/project_personnel/index.vue'
import { timeFormat } from '@/utils/util'
@ -203,6 +218,7 @@ const formData = reactive({
insurance_detail: '',
invoice_no: '',
handler: '',
amount_daxie: '',
annex: '',
})
@ -212,7 +228,13 @@ const formRules = reactive<any>({
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//

View File

@ -0,0 +1,176 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="工资付款单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="申请日期" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="合计金额" prop="due_date" show-overflow-tooltip />
<el-table-column label="合计金额大写" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="账户编码)" prop="insurance" show-overflow-tooltip />
<el-table-column label="投保金额(万元)" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="开户银行" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="账号" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="开户名称" prop="invoice_no" show-overflow-tooltip />
<el-table-column label="是否计息" prop="handler" show-overflow-tooltip />
<el-table-column label="开始计息日期" prop="handler" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name,pay_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-form-item label="组织id" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织id" @change="area_change">
<el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="部门id" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门id">
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code
" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="唯一标识" prop="theme">
<el-input v-model="formData.theme" clearable placeholder="请输入唯一标识" />
</el-form-item>
<el-form-item label="日期" prop="recording_time">
<el-date-picker class="flex-1 !flex" v-model="formData.recording_time" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
<el-form-item label="姓名" prop="supplier">
<el-input v-model="formData.supplier" clearable placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="身份证号" prop="supplier_contacts" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.supplier_contacts" clearable placeholder="身份证号" />
</el-form-item>
<el-form-item label="工种" prop="importance">
<el-radio-group v-model="formData.importance" placeholder="请选择工种">
<el-radio v-for="(item, index) in dictData.importance" :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="总收入" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入总收入" />
</el-form-item>
<el-form-item label="总支出" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入总支出" />
</el-form-item>
<el-form-item label="未发放" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入未发放" />
</el-form-item>
<el-form-item label="本次申请付款金额" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入本次申请付款金额" />
</el-form-item>
<el-form-item label="备注" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入备注" />
</el-form-item>
<el-form-item label="银行卡号" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入银行卡号" />
</el-form-item>
<el-form-item label="开户银行" prop="demand_content">
<el-input v-model="formData.demand_content" 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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectTable @customEvent="customEvent"></projectTable>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="customerDemandEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import projectTable from "@/components/project/index.vue"
import { apiCustomerDemandAdd, apiCustomerDemandEdit, apiCustomerDemandDetail } from '@/api/customer_demand'
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 orglist = reactive([])
const jobs = reactive([])
const project_name
= ref('')
const project_code
= ref('')
const custom_name
= ref('')
const formDataannex = reactive([])
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) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
// dialog
const showDialog = ref(false)
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code
.value = e.project_code;
custom_name
.value = e.custom_name;
showDialog.value = false;
};
const getlista = () => {
getAll().then((res) => {
// orglist = res.data
Object.assign(orglist, res)
})
}
const area_change = (e: any) => {
formData.org_id = e
let data = { 'org_id': e }
// console.log(data)
deptAll(data).then((res) => {
Object.assign(jobs, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑客户需求' : '新增客户需求'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
theme: '',
supplier: '',
supplier_contacts: '',
importance: '',
recording_time: '',
demand_content: '',
annex: '',
})
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) {
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
} else {
callback(new Error('电话号码格式不正确'))
}
}, 100)
}
}
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
deptAll({ 'org_id': data.org_id }).then((res) => {
Object.assign(jobs, res)
})
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)
}
project_name.value = data.project_name
custom_name.value = data.custom_name
project_code.value = data.project_code
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
//@ts-ignore
formData.recording_time = timeFormat(formData.recording_time, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomerDemandDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiCustomerDemandEdit(data)
: await apiCustomerDemandAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
getlista()
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -55,7 +55,7 @@
<el-table-column label="开户名称" prop="invoice_no" show-overflow-tooltip />
<el-table-column label="是否计息" prop="handler" show-overflow-tooltip />
<el-table-column label="开始计息日期" prop="handler" show-overflow-tooltip />
<el-table-column label="备注" prop="handler" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,256 @@
<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-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="合同名称" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="合同编号" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="客户名称" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="合同金额" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="合同金额大写" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="结算金额" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="结算金额大写" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="结算差异" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动计算" />
</el-form-item>
<el-form-item label="备注" prop="demand_content">
<el-input v-model="formData.demand_content" type="textarea" 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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectTable @customEvent="customEvent"></projectTable>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="customerDemandEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import projectTable from "@/components/project/index.vue"
import { apiCustomerDemandAdd, apiCustomerDemandEdit, apiCustomerDemandDetail } from '@/api/customer_demand'
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 orglist = reactive([])
const jobs = reactive([])
const project_name
= ref('')
const project_code
= ref('')
const custom_name
= ref('')
const formDataannex = reactive([])
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) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
// dialog
const showDialog = ref(false)
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code
.value = e.project_code;
custom_name
.value = e.custom_name;
showDialog.value = false;
};
const getlista = () => {
getAll().then((res) => {
// orglist = res.data
Object.assign(orglist, res)
})
}
const area_change = (e: any) => {
formData.org_id = e
let data = { 'org_id': e }
// console.log(data)
deptAll(data).then((res) => {
Object.assign(jobs, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑客户需求' : '新增客户需求'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
theme: '',
supplier: '',
supplier_contacts: '',
importance: '',
recording_time: '',
demand_content: '',
annex: '',
})
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) {
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
} else {
callback(new Error('电话号码格式不正确'))
}
}, 100)
}
}
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
deptAll({ 'org_id': data.org_id }).then((res) => {
Object.assign(jobs, res)
})
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)
}
project_name.value = data.project_name
custom_name.value = data.custom_name
project_code.value = data.project_code
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
//@ts-ignore
formData.recording_time = timeFormat(formData.recording_time, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomerDemandDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiCustomerDemandEdit(data)
: await apiCustomerDemandAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
getlista()
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,162 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="结算单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="合同名称" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="合计金额" prop="due_date" show-overflow-tooltip />
<el-table-column label="合同编号" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="结算日期" prop="insurance" show-overflow-tooltip />
<el-table-column label="合同金额" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="结算金额" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="结算差异" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="添加人" prop="invoice_no" show-overflow-tooltip />
<el-table-column label="负责人" prop="handler" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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,259 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目经理" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目开始日期" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="实际完成日期" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目组成员" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目金额(元)" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目总预算(元)" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目实际发生成本(元)" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="利润率()" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="人力发生时间H)" prop="project_id">
<el-input v-model="project_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
<el-form-item label="项目回款金额(元)" prop="project_id">
<el-input v-model="project_code" clearable disabled 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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectTable @customEvent="customEvent"></projectTable>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="customerDemandEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import projectTable from "@/components/project/index.vue"
import { apiCustomerDemandAdd, apiCustomerDemandEdit, apiCustomerDemandDetail } from '@/api/customer_demand'
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 orglist = reactive([])
const jobs = reactive([])
const project_name
= ref('')
const project_code
= ref('')
const custom_name
= ref('')
const formDataannex = reactive([])
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) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
// dialog
const showDialog = ref(false)
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code
.value = e.project_code;
custom_name
.value = e.custom_name;
showDialog.value = false;
};
const getlista = () => {
getAll().then((res) => {
// orglist = res.data
Object.assign(orglist, res)
})
}
const area_change = (e: any) => {
formData.org_id = e
let data = { 'org_id': e }
// console.log(data)
deptAll(data).then((res) => {
Object.assign(jobs, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑客户需求' : '新增客户需求'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
theme: '',
supplier: '',
supplier_contacts: '',
importance: '',
recording_time: '',
demand_content: '',
annex: '',
})
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) {
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
} else {
callback(new Error('电话号码格式不正确'))
}
}, 100)
}
}
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
deptAll({ 'org_id': data.org_id }).then((res) => {
Object.assign(jobs, res)
})
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)
}
project_name.value = data.project_name
custom_name.value = data.custom_name
project_code.value = data.project_code
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
//@ts-ignore
formData.recording_time = timeFormat(formData.recording_time, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomerDemandDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiCustomerDemandEdit(data)
: await apiCustomerDemandAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
getlista()
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,161 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="结案单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="实际完成日期" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="项目组成员" prop="due_date" show-overflow-tooltip />
<el-table-column label="项目金额(元)" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="项目总预算(元)" prop="insurance" show-overflow-tooltip />
<el-table-column label="项目实际发生成本(元)" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="利润率() " prop="insurance_company" show-overflow-tooltip />
<el-table-column label="人力发生时间(H)" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="项目回款金额(元)" prop="invoice_no" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,186 @@
<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="120px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
{{ formData.project_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号">
{{ formData.project_code }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名">
{{ formData.person_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ formData.person_idcard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保日期">
{{ formData.insurance_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到期日期">
{{ formData.due_date }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保费(元)">
{{ formData.insurance }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投保金额(万元)">
{{ formData.insured_amount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保险公司">
{{ formData.insurance_company }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保单明细">
{{ formData.insurance_detail }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票编号">
{{ formData.invoice_no
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人">
{{ formData.handler
}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同附件">
<div v-if="formDataannex.length > 0">
<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>
<div v-else>暂无附件</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>) => {
Object.assign(formData, data)
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)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.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="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-form-item label="组织id" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织id" @change="area_change">
<el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="部门id" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门id">
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="parseInt(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code
" clearable placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="唯一标识" prop="theme">
<el-input v-model="formData.theme" clearable placeholder="请输入唯一标识" />
</el-form-item>
<el-form-item label="日期" prop="recording_time">
<el-date-picker class="flex-1 !flex" v-model="formData.recording_time" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
<el-form-item label="姓名" prop="supplier">
<el-input v-model="formData.supplier" clearable placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="身份证号" prop="supplier_contacts" :rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="formData.supplier_contacts" clearable placeholder="身份证号" />
</el-form-item>
<el-form-item label="工种" prop="importance">
<el-radio-group v-model="formData.importance" placeholder="请选择工种">
<el-radio v-for="(item, index) in dictData.importance" :key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="总收入" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入总收入" />
</el-form-item>
<el-form-item label="总支出" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入总支出" />
</el-form-item>
<el-form-item label="未发放" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入未发放" />
</el-form-item>
<el-form-item label="本次申请付款金额" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入本次申请付款金额" />
</el-form-item>
<el-form-item label="备注" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入备注" />
</el-form-item>
<el-form-item label="银行卡号" prop="demand_content">
<el-input v-model="formData.demand_content" clearable placeholder="请输入银行卡号" />
</el-form-item>
<el-form-item label="开户银行" prop="demand_content">
<el-input v-model="formData.demand_content" 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-form>
</popup>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<projectTable @customEvent="customEvent"></projectTable>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="customerDemandEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import projectTable from "@/components/project/index.vue"
import { apiCustomerDemandAdd, apiCustomerDemandEdit, apiCustomerDemandDetail } from '@/api/customer_demand'
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 orglist = reactive([])
const jobs = reactive([])
const project_name
= ref('')
const project_code
= ref('')
const custom_name
= ref('')
const formDataannex = reactive([])
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) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
// dialog
const showDialog = ref(false)
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code
.value = e.project_code;
custom_name
.value = e.custom_name;
showDialog.value = false;
};
const getlista = () => {
getAll().then((res) => {
// orglist = res.data
Object.assign(orglist, res)
})
}
const area_change = (e: any) => {
formData.org_id = e
let data = { 'org_id': e }
// console.log(data)
deptAll(data).then((res) => {
Object.assign(jobs, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑客户需求' : '新增客户需求'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
theme: '',
supplier: '',
supplier_contacts: '',
importance: '',
recording_time: '',
demand_content: '',
annex: '',
})
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) {
setTimeout(() => {
if (phoneReg.test(value)) {
callback()
} else {
callback(new Error('电话号码格式不正确'))
}
}, 100)
}
}
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
deptAll({ 'org_id': data.org_id }).then((res) => {
Object.assign(jobs, res)
})
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)
}
project_name.value = data.project_name
custom_name.value = data.custom_name
project_code.value = data.project_code
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
//@ts-ignore
formData.recording_time = timeFormat(formData.recording_time, 'yyyy-mm-dd hh:MM:ss')
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomerDemandDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = JSON.stringify(formDataannex.map((item) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiCustomerDemandEdit(data)
: await apiCustomerDemandAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
getlista()
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,176 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="保单号" prop="insurance_no">
<el-input v-model="queryParams.insurance_no" clearable placeholder="请输入保单号" />
</el-form-item>
<el-form-item label="保险种类" prop="type">
<el-input v-model="queryParams.type" clearable placeholder="请输入保险种类" />
</el-form-item>
<el-form-item label="保险公司" prop="insurance_company">
<el-input v-model="queryParams.insurance_company" clearable placeholder="请输入保险公司" />
</el-form-item>
<el-form-item label="发票编号" prop="invoice_no">
<el-input v-model="queryParams.invoice_no" clearable placeholder="请输入发票编号" />
</el-form-item>
<el-form-item label="经办人" prop="handler">
<el-input v-model="queryParams.handler" clearable placeholder="请输入经办人" />
</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="['project.project_salary/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['project.project_salary/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" show-overflow-tooltip />
<el-table-column label="处理流程" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="流程步骤" prop="person_idcard" show-overflow-tooltip />
<el-table-column label="工资付款单号" prop="person_idcard" show-overflow-tooltip />
<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="person_idcard" show-overflow-tooltip />
<el-table-column label="申请日期" prop="insurance_date" show-overflow-tooltip />
<el-table-column label="合计金额" prop="due_date" show-overflow-tooltip />
<el-table-column label="合计金额大写" prop="insurance_no" show-overflow-tooltip />
<el-table-column label="账户编码)" prop="insurance" show-overflow-tooltip />
<el-table-column label="投保金额(万元)" prop="insured_amount" show-overflow-tooltip />
<el-table-column label="开户银行" prop="insurance_company" show-overflow-tooltip />
<el-table-column label="账号" prop="insurance_detail" show-overflow-tooltip />
<el-table-column label="开户名称" prop="invoice_no" show-overflow-tooltip />
<el-table-column label="是否计息" prop="handler" show-overflow-tooltip />
<el-table-column label="开始计息日期" prop="handler" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<!-- <el-table-column label="人员标识" prop="per_daily_living" show-overflow-tooltip /> -->
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['project.project_salary/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['project.project_salary/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['project.project_salary/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 { insurancemanagementLists, insurancemanagementDelete, insurancemanagementDetail } from '@/api/project_salary'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
type: '',
insurance_no: '',
insurance_company: '',
invoice_no: '',
handler: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('labor_contract_status,labor_contract_type,labor_contract_name')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: insurancemanagementLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await insurancemanagementDetail({ 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 insurancemanagementDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await insurancemanagementDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -6,13 +6,13 @@
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<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">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
@ -130,7 +130,7 @@
<el-dialog v-model="showDialog" title="选择供应商" width="70%">
<procurementDialog @customEvent="customEvent"></procurementDialog>
<suppliertable @customEvent="customEvent"></suppliertable>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<subcontractingDialog @customEvent="customEvent1"></subcontractingDialog>
@ -148,7 +148,7 @@
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import procurementDialog from '@/components/procurement/index.vue'
import suppliertable from '@/components/supplier/index.vue'
import subcontractingDialog from '@/components/procurementsubcontracting_selector/index.vue'
import { apifinancereceiptAdd, apifinancereceiptEdit, apifinancereceiptDetail } from '@/api/receiptrecord'
@ -170,6 +170,7 @@ const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const supplier_name = ref('')
const supplier_code = ref('')
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
@ -232,7 +233,8 @@ const showDialog1 = ref(false)
const customEvent = (e: any) => {
formData.supplier_id = e.id;
supplier_name.value = e.name;
supplier_code.value = e.supplier_code
supplier_name.value = e.supplier_name
showDialog.value = false;
};
const customEvent1 = (e: any) => {

View File

@ -6,13 +6,13 @@
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-form-item label="供应商名称" prop="supplier_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<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: 'blur' }]">
<el-input v-model="supplier_name" clearable placeholder="请选择客户" />
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -142,7 +142,7 @@
<el-dialog v-model="showDialog" title="选择供应商" width="70%">
<procurementDialog @customEvent="customEvent"></procurementDialog>
<suppliertable @customEvent="customEvent"></suppliertable>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<subcontractingDialog @customEvent="customEvent1"></subcontractingDialog>
@ -161,7 +161,7 @@
import customDialog from '@/components/custom-dialog/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import procurementDialog from '@/components/procurement/index.vue'
import suppliertable from '@/components/supplier/index.vue'
import subcontractingDialog from '@/components/procurementsubcontracting_selector/index.vue'
import bankaccountDialog from '@/components/bankaccount/index.vue'
import { apiFinancerefundAdd, apiFinancerefundEdit, apiFinancerefundDetail } from '@/api/refundrecord'
@ -182,6 +182,7 @@ const project_code = ref('')
const project_refund_amount = ref('')
const contract_no = ref('')
const supplier_name = ref('')
const supplier_code = ref('')
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
@ -245,7 +246,8 @@ const showDialog1 = ref(false)
const showDialog2 = ref(false)
const customEvent = (e: any) => {
formData.supplier_id = e.id;
supplier_name.value = e.name;
supplier_code.value = e.supplier_code
supplier_name.value = e.supplier_name
showDialog.value = false;
};
const customEvent1 = (e: any) => {

View File

@ -18,7 +18,7 @@
</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">
@ -32,13 +32,14 @@
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_id">
<el-input v-model="formData.supplier_id" clearable placeholder="请输入供应商合同号" />
<el-form-item label="供应商名称" prop="supplier_id" @change="showDialog1 = true">
<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">
<el-input v-model="formData.supplier_id" clearable placeholder="请输入供应商合同号" />
</el-form-item> </el-col>
<el-input v-model="supplier_code" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
@ -59,10 +60,7 @@
</el-date-picker>
</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="24">
<el-form-item label="付款方式" prop="pay_type">
<el-radio-group v-model="formData.pay_type" placeholder="请选择付款方式">
@ -80,13 +78,19 @@
</el-radio-group>
</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 label="合同金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入合同金额" @input="amountinput" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" clearable placeholder="请输入金额大写" />
<el-input v-model="formData.amount_daxie" clearable disabled 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="请输入不含税金额" @input="amountinput" />
</el-form-item> </el-col>
<el-col :span="8">
<el-form-item label="质保金比例" prop="retention_money_rate">
@ -217,14 +221,18 @@
<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 { toChinesNum } from "@/utils/util";
import projectTable from '@/components/project/index.vue'
import suppliertable from '@/components/supplier/index.vue'
import { apiSubcontractingContractAdd, apiSubcontractingContractEdit, apiSubcontractingContractDetail } from '@/api/subcontracting_contract'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
@ -242,6 +250,8 @@ 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 formDataannex = reactive([])
const tableData = reactive([])
const tableData1 = reactive([])
@ -292,6 +302,13 @@ const handleDelete1 = (row: any) => {
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑分包合同' : '新增分包合同'
})
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
const formData = reactive({
@ -336,8 +353,9 @@ const customEvent = (e: any) => {
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;
};
@ -399,7 +417,9 @@ const setFormData = async (data: Record<any, any>) => {
}
if (data.amount_daxie) {
amountinput(data.amount_daxie)
}
//@ts-ignore
formData.signing_date = timeFormat(formData.signing_date, 'yyyy-mm-dd hh:MM:ss')

View File

@ -1,13 +1,28 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="部门id" prop="department_id">
<el-input class="w-[280px]" v-model="queryParams.department_id" clearable placeholder="请输入部门id" />
<el-form class="mb-[-16px]" :model="queryParams" inline label-width="auto">
<el-form-item label="项目" prop="project_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.value)" />
</el-select>
</el-form-item>
<el-form-item label="供应商" prop="supplier_id">
<el-select v-model="queryParams.supplier_id" clearable placeholder="请选择供应商">
<el-option v-for="(item, index) in supplierList" :key="index" :label="item.supplier_name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
<el-form-item label="合同名称" prop="contract_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="合同编号" prop="contract_no">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同类型" prop="contract_type">
<el-select v-model="queryParams.contract_type" clearable 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-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
@ -84,6 +99,8 @@ import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiSubcontractingContractLists, apiSubcontractingContractDelete, apiSubcontractingContractDetail } from '@/api/subcontracting_contract'
import { timeFormat } from '@/utils/util'
import { apiProjectLists } from '@/api/project'
import { apisupplierLists } from '@/api/suppler_list'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
@ -92,12 +109,15 @@ const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const projectList = ref([])
const supplierList = ref([])
//
const queryParams = reactive({
department_id: '',
contract_name: ''
contract_name: '',
contract_no: '',
project_id: '',
contract_type: '',
supplier_id: ''
})
//
@ -139,6 +159,7 @@ const handleDelete = async (id: number | any[]) => {
await apiSubcontractingContractDelete({ id })
getLists()
}
//
const handleDetail = async (data: any) => {
let res = await apiSubcontractingContractDetail({ id: data.id })
showDtail.value = true
@ -147,8 +168,18 @@ const handleDetail = async (data: any) => {
detailRef.value?.setFormData(res)
}
//
const projectlist = async () => {
let res = await apiProjectLists({ page_no: 1, page_size: 9999 })
projectList.value = res.lists
}
//
const supplierlist = async () => {
let res = await apisupplierLists({ page_no: 1, page_size: 9999 })
supplierList.value = res.lists
}
projectlist()
supplierlist()
getLists()
</script>

View File

@ -0,0 +1,162 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="部门id" prop="department_id">
<el-input class="w-[280px]" v-model="queryParams.department_id" clearable placeholder="请输入部门id" />
</el-form-item>
<el-form-item label="合同名称" prop="contract_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</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="['contract.subcontracting_contract/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['contract.subcontracting_contract/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" 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="contract_no" show-overflow-tooltip />
<el-table-column label="合同名称" prop="contract_name" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="合同类型" prop="contract_type">
<template #default="{ row }">
<dict-value :options="dictData.contract_type" :value="row.contract_type" />
</template>
</el-table-column>
<el-table-column label="签订日期" prop="signing_date" show-overflow-tooltip />
<el-table-column label="付款方式" prop="pay_type" show-overflow-tooltip />
<el-table-column label="账期" prop="account_period">
<template #default="{ row }">
<dict-value :options="dictData.account_period" :value="row.account_period" />
</template>
</el-table-column>
<el-table-column label="合同金额" prop="amount" show-overflow-tooltip />
<el-table-column label="工作类型" prop="amount_daxie" show-overflow-tooltip />
<el-table-column label="工作内容" prop="amount_daxie" show-overflow-tooltip />
<el-table-column label="项目特征" prop="amount_daxie" show-overflow-tooltip />
<el-table-column label="单位" prop="amount_daxie" show-overflow-tooltip />
<el-table-column label="税率" prop="tax_rate">
<template #default="{ row }">
<dict-value :options="dictData.tax_rate" :value="row.tax_rate" />
</template>
</el-table-column>
<el-table-column label="工作量" prop="amount_daxie" show-overflow-tooltip />
<el-table-column label="不含税金额" prop="amount_excluding_tax" show-overflow-tooltip />
<el-table-column label="含税单价" prop="amount_excluding_tax" show-overflow-tooltip />
<el-table-column label="质保金比例" prop="retention_money" show-overflow-tooltip />
<el-table-column label="质保金" prop="retention_money_rate" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['contract.subcontracting_contract/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['contract.subcontracting_contract/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['contract.subcontracting_contract/detail']" link @click="handleDetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex mt-4 justify-end">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<!-- <detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" /> -->
</div>
</template>
<script lang="ts" setup name="subcontractingContractLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiSubcontractingContractLists, apiSubcontractingContractDelete, apiSubcontractingContractDetail } from '@/api/subcontracting_contract'
import { timeFormat } from '@/utils/util'
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 queryParams = reactive({
department_id: '',
contract_name: ''
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('contract_type,account_period,tax_rate,pay_type,pay_period ')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiSubcontractingContractLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
let res = await apiSubcontractingContractDetail({ 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 apiSubcontractingContractDelete({ id })
getLists()
}
const handleDetail = async (data: any) => {
let res = await apiSubcontractingContractDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>