Browse Source

feat(inspection): 新增费用明细和附件管理功能

- 实现费用明细表格展示、新增、编辑、删除功能
- 集成字典选择器用于费用类型选择
- 添加附件上传、下载、删除管理功能
- 实现申请单关联费用功能
- 新增待验货申请列表页面
- 添加多个页签组件用于展示不同业务信息
master
qiankanghui 3 months ago
parent
commit
13140ea6f2
  1. 66
      src/api/inspection/srmFee.js
  2. 266
      src/views/modules/inspection/com_feeDetailTab.vue
  3. 2
      src/views/modules/inspection/com_inspectionRequestAttachmentTab.vue
  4. 91
      src/views/modules/inspection/com_inspectionRequestFeeTab.vue
  5. 244
      src/views/modules/inspection/com_requestFeeTab.vue
  6. 128
      src/views/modules/inspection/inspectionPendingList.vue
  7. 118
      src/views/modules/inspection/inspectionRequestAudit.vue
  8. 160
      src/views/modules/inspection/inspectionRequestList.vue
  9. 142
      src/views/modules/inspection/inspectionScheduleList.vue
  10. 518
      src/views/modules/inspection/srmFeeList.vue

66
src/api/inspection/srmFee.js

@ -0,0 +1,66 @@
import { createAPI } from '@/utils/httpRequest.js'
/**
* 分页查询费用主记录列表
*/
export const searchFeeHeaderList = (data) => createAPI(`/inspection/fee/searchFeeHeaderList`, 'post', data)
/**
* 根据费用单号查询主记录
*/
export const getFeeHeaderByNo = (params) => createAPI(`/inspection/fee/getFeeHeaderByNo`, 'post', params)
/**
* 创建费用主记录
*/
export const createFeeHeader = (data) => createAPI(`/inspection/fee/createFeeHeader`, 'post', data)
/**
* 更新费用主记录
*/
export const updateFeeHeader = (data) => createAPI(`/inspection/fee/updateFeeHeader`, 'post', data)
/**
* 删除费用记录
*/
export const deleteFeeRecord = (params) => createAPI(`/inspection/fee/deleteFeeRecord`, 'post', params)
/**
* 查询费用明细列表
*/
export const getFeeDetailList = (params) => createAPI(`/inspection/fee/getFeeDetailList`, 'post', params)
/**
* 添加费用明细单条
*/
export const addFeeDetail = (data) => createAPI(`/inspection/fee/addFeeDetail`, 'post', data)
/**
* 更新费用明细
*/
export const updateFeeDetail = (data) => createAPI(`/inspection/fee/updateFeeDetail`, 'post', data)
/**
* 删除费用明细
*/
export const deleteFeeDetail = (params) => createAPI(`/inspection/fee/deleteFeeDetail`, 'post', params)
/**
* 查询关联的申请单列表
*/
export const getRequestFeeList = (params) => createAPI(`/inspection/fee/getRequestFeeList`, 'post', params)
/**
* 添加关联申请单批量
*/
export const addRequestFees = (data) => createAPI(`/inspection/fee/addRequestFees`, 'post', data)
/**
* 删除关联申请单
*/
export const deleteRequestFee = (params) => createAPI(`/inspection/fee/deleteRequestFee`, 'post', params)
/**
* 根据申请单号查询费用明细
*/
export const getFeeDetailByRequestNo = (data) => createAPI(`/inspection/fee/getFeeDetailByRequestNo`, 'post', data)

266
src/views/modules/inspection/com_feeDetailTab.vue

@ -0,0 +1,266 @@
<template>
<div class="fee-detail-tab">
<div style="margin-bottom: 5px;">
<el-button type="primary" size="small" @click="handleAdd">新增明细</el-button>
</div>
<el-table
:data="detailList"
border
:height="tableHeight"
v-loading="loading"
style="width: 100%;">
<el-table-column type="index" label="行号" header-align="center" align="center" width="60"/>
<el-table-column prop="feeType" label="费用类型" header-align="center" align="left" min-width="150">
<template slot-scope="scope">
<span>{{ scope.row.feeType }}</span>
</template>
</el-table-column>
<el-table-column prop="amount" label="金额" header-align="center" align="right" width="120">
<template slot-scope="scope">
<span>{{ scope.row.amount ? scope.row.amount.toFixed(2) : '0.00' }}</span>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" header-align="center" align="left" min-width="200">
<template slot-scope="scope">
<span>{{ scope.row.remark }}</span>
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="150" fixed="right">
<template slot-scope="scope">
<el-link type="primary" @click="handleEdit(scope.row)" style="margin-right: 10px;">编辑</el-link>
<el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 新增/编辑弹窗 -->
<el-dialog
:title="dialogTitle"
:visible.sync="dialogVisible"
width="500px"
custom-class="custom-dialog"
:close-on-click-modal="false">
<el-form :model="formData" :rules="formRules" ref="formRef" label-position="top">
<el-form-item label="费用类型" prop="feeType">
<sys-dict-select
v-model="formData.feeType"
dict-type="fee_type"
placeholder="请选择费用类型"
width="50%"
filterable
/>
</el-form-item>
<el-form-item label="金额" prop="amount">
<el-input-number
v-model="formData.amount"
:min="0"
:precision="2"
style="width: 50%">
</el-input-number>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="formData.remark"
type="textarea"
:rows="3"
placeholder="请输入备注">
</el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
<el-button @click="dialogVisible = false">取消</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getFeeDetailList, addFeeDetail, updateFeeDetail, deleteFeeDetail } from '@/api/inspection/srmFee.js'
import SysDictSelect from '@/components/dict/SysDictSelect.vue'
export default {
name: 'FeeDetailTab',
components: {
SysDictSelect
},
props: {
feeData: {
type: Object,
default: () => ({})
},
tableHeight: {
type: Number,
default: 400
}
},
data() {
return {
detailList: [],
loading: false,
dialogVisible: false,
dialogTitle: '新增明细',
submitLoading: false,
formData: {
feeType: '',
amount: 0,
remark: ''
},
formRules: {
feeType: [
{ required: true, message: '请输入费用类型', trigger: 'blur' }
],
amount: [
{ required: true, message: '请输入金额', trigger: 'blur' }
]
},
currentEditRow: null
}
},
watch: {
'feeData.feeNo': {
handler(newVal) {
if (newVal) {
this.loadDetailList()
}
},
immediate: true
}
},
methods: {
//
loadDetailList() {
if (!this.feeData.feeNo || !this.feeData.site) {
this.detailList = []
return
}
this.loading = true
const params = {
site: this.feeData.site,
feeNo: this.feeData.feeNo
}
getFeeDetailList(params).then(({ data }) => {
if (data.code === 0 && data.details) {
this.detailList = data.details
} else {
this.detailList = []
}
}).catch(() => {
this.detailList = []
}).finally(() => {
this.loading = false
})
},
//
handleAdd() {
this.dialogTitle = '新增明细'
this.formData = {
feeType: '',
amount: 0,
remark: ''
}
this.currentEditRow = null
this.dialogVisible = true
this.$nextTick(() => {
if (this.$refs.formRef) {
this.$refs.formRef.clearValidate()
}
})
},
//
handleEdit(row) {
this.dialogTitle = '编辑明细'
this.formData = {
feeType: row.feeType,
amount: row.amount,
remark: row.remark
}
this.currentEditRow = row
this.dialogVisible = true
this.$nextTick(() => {
if (this.$refs.formRef) {
this.$refs.formRef.clearValidate()
}
})
},
//
handleSubmit() {
this.$refs.formRef.validate((valid) => {
if (!valid) {
return false
}
this.submitLoading = true
const params = {
site: this.feeData.site,
feeNo: this.feeData.feeNo,
feeType: this.formData.feeType,
amount: this.formData.amount || 0,
remark: this.formData.remark || '',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
}
// itemNo
if (this.currentEditRow) {
params.itemNo = this.currentEditRow.itemNo
}
const apiCall = this.currentEditRow
? updateFeeDetail(params)
: addFeeDetail(params)
apiCall.then(({ data }) => {
if (data.code === 0) {
this.$message.success('保存成功')
this.dialogVisible = false
this.loadDetailList()
} else {
this.$message.error(data.msg || '保存失败')
}
}).catch(() => {
this.$message.error('保存失败')
}).finally(() => {
this.submitLoading = false
})
})
},
//
handleDelete(row) {
this.$confirm('确定要删除该明细吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
site: this.$store.state.user.site,
feeNo: row.feeNo,
itemNo: row.itemNo
}
deleteFeeDetail(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.loadDetailList()
} else {
this.$message.error(data.msg || '删除失败')
}
}).catch(() => {
this.$message.error('删除失败')
})
}).catch(() => {})
},
}
}
</script>
<style lang="scss">
.custom-dialog .el-dialog__body {
min-height: 200px;
}
</style>

2
src/views/modules/inspection/com_inspectionRequestAttachmentTab.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="customer-css"> <div class="customer-css">
<!-- 操作按钮 --> <!-- 操作按钮 -->
<el-form :inline="true" style="margin-bottom: 10px;">
<el-form :inline="true" style="margin-bottom: 2px;">
<el-button type="primary" icon="el-icon-upload" @click="handleUpload" :disabled="!searchData.requestNo">上传附件</el-button> <el-button type="primary" icon="el-icon-upload" @click="handleUpload" :disabled="!searchData.requestNo">上传附件</el-button>
</el-form> </el-form>

91
src/views/modules/inspection/com_inspectionRequestFeeTab.vue

@ -0,0 +1,91 @@
<template>
<div class="fee-request-tab">
<el-table
:data="feeDetailList"
border
:height="tableHeight"
v-loading="loading"
style="width: 100%;">
<el-table-column type="index" label="行号" header-align="center" align="center" width="60"/>
<el-table-column prop="feeNo" label="费用单号" header-align="center" align="left" min-width="120"/>
<el-table-column prop="feeType" label="费用类型" header-align="center" align="left" min-width="120"/>
<el-table-column prop="amount" label="金额" header-align="center" align="right" width="120">
<template slot-scope="scope">
<span>{{ scope.row.amount ? scope.row.amount.toFixed(2) : '0.00' }}</span>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" header-align="center" align="left" min-width="200"/>
<el-table-column prop="createBy" label="创建人" header-align="center" align="center" width="100"/>
<el-table-column prop="createDate" label="创建时间" header-align="center" align="center" width="160"/>
</el-table>
</div>
</template>
<script>
import { getFeeDetailByRequestNo } from '@/api/inspection/srmFee.js'
export default {
name: 'InspectionRequestFeeTab',
props: {
detailData: {
type: Object,
default: () => ({})
},
tableHeight: {
type: Number,
default: 400
}
},
data() {
return {
feeDetailList: [],
loading: false
}
},
watch: {
'detailData.requestNo': {
handler(newVal) {
if (newVal) {
this.loadFeeDetailList()
} else {
this.feeDetailList = []
}
},
immediate: true
}
},
methods: {
loadFeeDetailList() {
if (!this.detailData.requestNo || !this.detailData.site) {
this.feeDetailList = []
return
}
this.loading = true
const params = {
site: this.detailData.site,
requestNo: this.detailData.requestNo,
feeNo: ''
}
getFeeDetailByRequestNo(params).then(({ data }) => {
if (data.code === 0 && data.details) {
this.feeDetailList = data.details
} else {
this.feeDetailList = []
}
}).catch(() => {
this.feeDetailList = []
}).finally(() => {
this.loading = false
})
}
}
}
</script>
<style scoped lang="scss">
.fee-request-tab {
padding: 0px;
}
</style>

244
src/views/modules/inspection/com_requestFeeTab.vue

@ -0,0 +1,244 @@
<template>
<div class="request-fee-tab">
<div style="margin-bottom: 2px;">
<el-button type="primary" size="small" @click="handleAddRequest">添加申请单</el-button>
</div>
<el-table
:data="requestFeeList"
border
:height="tableHeight"
v-loading="loading"
style="width: 100%;">
<el-table-column type="index" label="序号" header-align="center" align="center" width="60"/>
<el-table-column prop="requestNo" label="申请单号" header-align="center" align="left" min-width="150"/>
<el-table-column prop="createBy" label="关联人" header-align="center" align="left" width="120"/>
<el-table-column prop="createDate" label="关联时间" header-align="center" align="center" width="160">
<template slot-scope="scope">
{{ scope.row.createDate | formatDate }}
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="100" fixed="right">
<template slot-scope="scope">
<el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 选择申请单弹窗 -->
<el-dialog
title="选择申请单"
:visible.sync="selectDialogVisible"
width="70%"
top="5vh">
<el-form :inline="true" size="small">
<el-form-item label="申请单号">
<el-input v-model="searchRequestNo" placeholder="请输入申请单号" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchRequests">查询</el-button>
</el-form-item>
</el-form>
<el-table
:data="availableRequests"
border
height="300"
@selection-change="handleSelectionChange"
v-loading="requestLoading">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column prop="requestNo" label="申请单号" header-align="center" align="left" min-width="150"/>
<el-table-column prop="supplierName" label="供应商名称" header-align="center" align="left" min-width="200"/>
<el-table-column prop="status" label="状态" header-align="center" align="center" width="100"/>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirmAddRequests">确定</el-button>
<el-button @click="selectDialogVisible = false">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getRequestFeeList, addRequestFees, deleteRequestFee } from '@/api/inspection/srmFee.js'
import { searchInspectionRequestHeaderList } from '@/api/inspection/inspectionRequestHeader.js'
export default {
name: 'RequestFeeTab',
props: {
feeData: {
type: Object,
default: () => ({})
},
tableHeight: {
type: Number,
default: 400
}
},
data() {
return {
requestFeeList: [],
loading: false,
selectDialogVisible: false,
availableRequests: [],
requestLoading: false,
selectedRequests: [],
searchRequestNo: ''
}
},
filters: {
formatDate(value) {
if (!value) return ''
const date = new Date(value)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hour = String(date.getHours()).padStart(2, '0')
const minute = String(date.getMinutes()).padStart(2, '0')
const second = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}
},
watch: {
'feeData.feeNo': {
handler(newVal) {
if (newVal) {
this.loadRequestFeeList()
}
},
immediate: true
}
},
methods: {
//
loadRequestFeeList() {
if (!this.feeData.feeNo || !this.feeData.site) {
this.requestFeeList = []
return
}
this.loading = true
const params = {
site: this.feeData.site,
feeNo: this.feeData.feeNo
}
getRequestFeeList(params).then(({ data }) => {
if (data.code === 0 && data.requestFees) {
this.requestFeeList = data.requestFees
} else {
this.requestFeeList = []
}
}).catch(() => {
this.requestFeeList = []
}).finally(() => {
this.loading = false
})
},
//
handleAddRequest() {
this.selectDialogVisible = true
this.searchRequests()
},
//
searchRequests() {
this.requestLoading = true
const params = {
page: 1,
limit: 100,
site: this.$store.state.user.site
}
if (this.searchRequestNo) {
params.requestNo = this.searchRequestNo
}
searchInspectionRequestHeaderList(params).then(({ data }) => {
if (data.code === 0 && data.page) {
//
const existingRequestNos = this.requestFeeList.map(item => item.requestNo)
this.availableRequests = data.page.list.filter(item => !existingRequestNos.includes(item.requestNo))
} else {
this.availableRequests = []
}
}).catch(() => {
this.availableRequests = []
}).finally(() => {
this.requestLoading = false
})
},
//
handleSelectionChange(selection) {
this.selectedRequests = selection
},
//
confirmAddRequests() {
if (this.selectedRequests.length === 0) {
this.$message.warning('请至少选择一个申请单')
return
}
const requestNos = this.selectedRequests.map(item => item.requestNo)
const params = {
site: this.feeData.site,
feeNo: this.feeData.feeNo,
currentUser: this.$store.state.user.name,
requestNos: requestNos
}
addRequestFees(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('添加成功')
this.selectDialogVisible = false
this.loadRequestFeeList()
} else {
this.$message.error(data.msg || '添加失败')
}
}).catch(() => {
this.$message.error('添加失败')
})
},
//
handleDelete(row) {
this.$confirm('确定要删除该关联吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
site: row.site,
feeNo: row.feeNo,
requestNo: row.requestNo
}
deleteRequestFee(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.loadRequestFeeList()
} else {
this.$message.error(data.msg || '删除失败')
}
}).catch(() => {
this.$message.error('删除失败')
})
}).catch(() => {})
}
}
}
</script>
<style scoped lang="scss">
.request-fee-tab {
padding-top: 0;
padding-left: 0;
}
</style>

128
src/views/modules/inspection/inspectionPendingList.vue

@ -1,63 +1,52 @@
<template> <template>
<div class="customer-css"> <div class="customer-css">
<!-- 查询条件 --> <!-- 查询条件 -->
<el-form :inline="true" label-width="90px" class="search-form-inline">
<!-- 第一行 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商编码" class="search-item">
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商名称" class="search-item">
<el-input v-model="searchData.supplierName" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="申请日期">
<el-form-item label="申请日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="状态">
<el-select v-model="searchData.status" disabled class="input-mini">
<el-form-item label="状态" class="search-item">
<el-select v-model="searchData.status" disabled style="width: 100%">
<el-option label="已排程" value="Scheduled" /> <el-option label="已排程" value="Scheduled" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第二行 -->
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="申请单号">
<el-input v-model="searchData.requestNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请单号" class="search-item">
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="建议验货日期">
<el-form-item label="建议验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="计划验货日期">
<el-form-item label="计划验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div>
<!-- 按钮 - 只有查询功能 -->
<div class="search-btn-row">
<el-button type="primary" class="customer-bun-min" @click="getMainData">查询</el-button>
<el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData" style="">查询</el-button>
</el-form-item>
</div> </div>
</el-form> </el-form>
@ -592,32 +581,40 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.search-form-inline { .search-form-inline {
padding: 10px 15px 0 0;
background: #fff; background: #fff;
} }
.search-row { .search-row {
display: flex; display: flex;
align-items: center;
align-items: flex-end;
flex-wrap: nowrap; flex-wrap: nowrap;
margin-bottom: 6px;
gap: 15px;
} }
.search-btn-row {
margin-top: 10px;
padding-left: 8px;
.search-item {
flex: none;
margin-bottom: 10px;
} }
.input-small {
width: 110px;
.search-btn-item {
flex: none;
margin-bottom: 10px;
} }
.input-mini {
width: 90px;
.search-btn-item /deep/ .el-form-item__content {
line-height: normal;
}
.search-item /deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-bottom: 5px;
line-height: 1;
height: auto;
} }
.date-small {
width: 100px;
.search-item /deep/ .el-form-item__content {
line-height: normal;
} }
.date-range { .date-range {
@ -625,51 +622,12 @@ export default {
align-items: center; align-items: center;
} }
.date-small {
width: 130px;
}
.split { .split {
padding: 0 6px; padding: 0 6px;
color: #606266; color: #606266;
font-size: 13px; font-size: 13px;
} }
/deep/ .el-form-item {
margin-right: 18px;
margin-bottom: 6px;
}
/deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-right: 8px;
line-height: 32px;
font-weight: 500;
}
/deep/ .el-form-item__content {
line-height: normal;
}
/deep/ .el-input__inner {
height: 32px;
line-height: 32px;
}
/deep/ .el-date-editor .el-input__inner {
padding-right: 10px;
padding-left: 10px;
}
/deep/ .el-date-editor .el-input__prefix {
display: none;
}
/deep/ .el-date-editor .el-input__suffix {
display: none;
}
/deep/ .customer-tab .el-tabs__content { /deep/ .customer-tab .el-tabs__content {
padding: 5px !important; padding: 5px !important;
} }

118
src/views/modules/inspection/inspectionRequestAudit.vue

@ -1,56 +1,45 @@
<template> <template>
<div class="customer-css"> <div class="customer-css">
<!-- 查询条件 --> <!-- 查询条件 -->
<el-form :inline="true" label-width="90px" class="search-form-inline">
<!-- 第一行 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商编码" class="search-item">
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商名称" class="search-item">
<el-input v-model="searchData.supplierName" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="申请日期">
<el-form-item label="申请日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="状态">
<el-select v-model="searchData.status" clearable class="input-mini" placeholder="全部" disabled>
<el-form-item label="状态" class="search-item">
<el-select v-model="searchData.status" clearable placeholder="全部" disabled style="width: 100%">
<el-option label="已确认" value="Confirmed" /> <el-option label="已确认" value="Confirmed" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第二行 -->
<div class="search-row"> <div class="search-row">
<el-form-item label="申请单号">
<el-input v-model="searchData.requestNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请单号" class="search-item">
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="建议验货日期" style="margin-left: 90px;">
<el-form-item label="建议验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div>
<!-- 按钮 -->
<div class="search-btn-row">
<el-button type="primary" class="customer-bun-min" @click="getMainData">查询</el-button>
<el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData" style="">查询</el-button>
</el-form-item>
</div> </div>
</el-form> </el-form>
@ -550,32 +539,40 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.search-form-inline { .search-form-inline {
padding: 10px 15px 0 0;
background: #fff; background: #fff;
} }
.search-row { .search-row {
display: flex; display: flex;
align-items: center;
align-items: flex-end;
flex-wrap: nowrap; flex-wrap: nowrap;
margin-bottom: 6px;
gap: 15px;
}
.search-item {
flex: none;
margin-bottom: 10px;
} }
.search-btn-row {
margin-top: 10px;
padding-left: 8px;
.search-btn-item {
flex: none;
margin-bottom: 10px;
} }
.input-small {
width: 110px;
.search-btn-item /deep/ .el-form-item__content {
line-height: normal;
} }
.input-mini {
width: 90px;
.search-item /deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-bottom: 5px;
line-height: 1;
height: auto;
} }
.date-small {
width: 130px;
.search-item /deep/ .el-form-item__content {
line-height: normal;
} }
.date-range { .date-range {
@ -589,41 +586,6 @@ export default {
font-size: 13px; font-size: 13px;
} }
/deep/ .el-form-item {
margin-right: 18px;
margin-bottom: 6px;
}
/deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-right: 8px;
line-height: 32px;
font-weight: 500;
}
/deep/ .el-form-item__content {
line-height: normal;
}
/deep/ .el-input__inner {
height: 32px;
line-height: 32px;
}
/deep/ .el-date-editor .el-input__inner {
padding-right: 10px;
padding-left: 10px;
}
/deep/ .el-date-editor .el-input__prefix {
display: none;
}
/deep/ .el-date-editor .el-input__suffix {
display: none;
}
/deep/ .customer-tab .el-tabs__content { /deep/ .customer-tab .el-tabs__content {
padding: 5px !important; padding: 5px !important;
} }

160
src/views/modules/inspection/inspectionRequestList.vue

@ -1,27 +1,23 @@
<template> <template>
<div class="customer-css"> <div class="customer-css">
<!-- 查询条件 --> <!-- 查询条件 -->
<el-form :inline="true" label-width="90px" class="search-form-inline">
<!-- 第一行 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商编码" class="search-item">
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商名称" class="search-item">
<el-input v-model="searchData.supplierName" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="申请日期">
<el-form-item label="申请日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="状态">
<el-select v-model="searchData.status" clearable class="input-mini" placeholder="全部">
<el-form-item label="状态" class="search-item">
<el-select v-model="searchData.status" clearable placeholder="全部" style="width: 100%">
<el-option label="全部" value="" /> <el-option label="全部" value="" />
<el-option label="草稿" value="Draft" /> <el-option label="草稿" value="Draft" />
<el-option label="已确认" value="Confirmed" /> <el-option label="已确认" value="Confirmed" />
@ -31,53 +27,41 @@
<el-option label="已取消" value="Cancelled" /> <el-option label="已取消" value="Cancelled" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第二行 -->
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'qcOperator')"><a href="#">QC人员</a></span>
<el-input v-model="searchData.qcOperator" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="QC人员" class="search-item">
<el-input v-model="searchData.qcOperator" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="建议验货日期" >
<el-form-item label="建议验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第三行 -->
<div class="search-row"> <div class="search-row">
<el-form-item label="申请单号">
<el-input v-model="searchData.requestNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请单号" class="search-item">
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="计划验货日期">
<el-form-item label="计划验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div>
<!-- 按钮 -->
<div class="search-btn-row">
<el-button type="primary" class="customer-bun-min" @click="getMainData">查询</el-button>
<el-button type="primary" class="customer-bun-min" @click="addInspectionRequest">新增</el-button>
<el-button type="primary" class="customer-bun-min" @click="importExcel">Excel导入</el-button>
<el-button type="primary" class="customer-bun-min" @click="exportExcel">导出</el-button>
<el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData" style="">查询</el-button>
<el-button type="primary" @click="addInspectionRequest" style="margin-left: 2px">新增</el-button>
<el-button type="primary" @click="importExcel" style="margin-left: 2px">Excel导入</el-button>
<el-button type="primary" @click="exportExcel" style="margin-left: 2px">导出</el-button>
</el-form-item>
</div> </div>
</el-form> </el-form>
@ -156,6 +140,10 @@
<el-tab-pane label="附件管理" name="attachment"> <el-tab-pane label="附件管理" name="attachment">
<inspection-request-attachment-tab ref="attachmentTab" :detail-data="currentRow" :table-height="detailHeight" /> <inspection-request-attachment-tab ref="attachmentTab" :detail-data="currentRow" :table-height="detailHeight" />
</el-tab-pane> </el-tab-pane>
<!-- 费用明细 -->
<el-tab-pane label="费用明细" name="fee">
<inspection-request-fee-tab ref="feeTab" :detail-data="currentRow" :table-height="detailHeight" />
</el-tab-pane>
</el-tabs> </el-tabs>
<!-- 新增弹窗 --> <!-- 新增弹窗 -->
@ -362,6 +350,7 @@ import ComInspectionRequestDetailTab from './com_inspectionRequestDetailTab.vue'
import ComInspectionRequestPoDetailTab from './com_inspectionRequestPoDetailTab.vue' import ComInspectionRequestPoDetailTab from './com_inspectionRequestPoDetailTab.vue'
import ComInspectionResultTab from './com_inspectionResultTab.vue' import ComInspectionResultTab from './com_inspectionResultTab.vue'
import ComInspectionRequestAttachmentTab from './com_inspectionRequestAttachmentTab.vue' import ComInspectionRequestAttachmentTab from './com_inspectionRequestAttachmentTab.vue'
import ComInspectionRequestFeeTab from './com_inspectionRequestFeeTab.vue'
import excel from '@/utils/excel-util.js' import excel from '@/utils/excel-util.js'
export default { export default {
@ -371,7 +360,8 @@ export default {
InspectionRequestDetailTab: ComInspectionRequestDetailTab, InspectionRequestDetailTab: ComInspectionRequestDetailTab,
InspectionRequestPoDetailTab: ComInspectionRequestPoDetailTab, InspectionRequestPoDetailTab: ComInspectionRequestPoDetailTab,
InspectionResultTab: ComInspectionResultTab, InspectionResultTab: ComInspectionResultTab,
InspectionRequestAttachmentTab: ComInspectionRequestAttachmentTab
InspectionRequestAttachmentTab: ComInspectionRequestAttachmentTab,
InspectionRequestFeeTab: ComInspectionRequestFeeTab
}, },
data () { data () {
return { return {
@ -785,6 +775,13 @@ export default {
this.$refs.attachmentTab.loadAttachmentTypeList() this.$refs.attachmentTab.loadAttachmentTypeList()
} }
}) })
} else if (tab.name === 'fee') {
// - watch
this.$nextTick(() => {
if (this.$refs.feeTab) {
this.$refs.feeTab.loadFeeDetailList()
}
})
} }
}, },
@ -1185,32 +1182,40 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.search-form-inline { .search-form-inline {
padding: 10px 15px 0 0;
background: #fff; background: #fff;
}
}
.search-row { .search-row {
display: flex; display: flex;
align-items: center;
align-items: flex-end;
flex-wrap: nowrap; flex-wrap: nowrap;
margin-bottom: 6px;
gap: 15px;
} }
.search-btn-row {
margin-top: 10px;
padding-left: 8px;
.search-item {
flex: none;
margin-bottom: 10px;
} }
.input-small {
width: 110px;
.search-btn-item {
flex: none;
margin-bottom: 10px;
} }
.input-mini {
width: 90px;
.search-btn-item /deep/ .el-form-item__content {
line-height: normal;
} }
.date-small {
width: 100px;
.search-item /deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-bottom: 5px;
line-height: 1;
height: auto;
}
.search-item /deep/ .el-form-item__content {
line-height: normal;
} }
.date-range { .date-range {
@ -1218,51 +1223,12 @@ padding: 10px 15px 0 0;
align-items: center; align-items: center;
} }
.date-small {
width: 130px;
}
.split { .split {
padding: 0 6px; padding: 0 6px;
color: #606266; color: #606266;
font-size: 13px; font-size: 13px;
} }
/deep/ .el-form-item {
margin-right: 18px;
margin-bottom: 6px;
}
/deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-right: 8px;
line-height: 32px;
font-weight: 500;
}
/deep/ .el-form-item__content {
line-height: normal;
}
/deep/ .el-input__inner {
height: 32px;
line-height: 32px;
}
/deep/ .el-date-editor .el-input__inner {
padding-right: 10px;
padding-left: 10px;
}
/deep/ .el-date-editor .el-input__prefix {
display: none;
}
/deep/ .el-date-editor .el-input__suffix {
display: none;
}
/deep/ .customer-tab .el-tabs__content { /deep/ .customer-tab .el-tabs__content {
padding: 5px !important; padding: 5px !important;
} }

142
src/views/modules/inspection/inspectionScheduleList.vue

@ -1,72 +1,59 @@
<template> <template>
<div class="schedule-page-container"> <div class="schedule-page-container">
<!-- 查询条件 --> <!-- 查询条件 -->
<el-form :inline="true" label-width="90px" class="search-form-inline">
<!-- 第一行 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商编码" class="search-item">
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="供应商名称" class="search-item">
<el-input v-model="searchData.supplierName" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="申请日期">
<el-form-item label="申请日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="状态">
<el-select v-model="searchData.status" class="input-mini">
<el-form-item label="状态" class="search-item">
<el-select v-model="searchData.status" style="width: 100%">
<el-option label="已审核" value="AUDITED" /> <el-option label="已审核" value="AUDITED" />
<el-option label="已排程" value="SCHEDULED" /> <el-option label="已排程" value="SCHEDULED" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第二行 -->
<div class="search-row"> <div class="search-row">
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'qcOperator')"><a href="#">QC人员</a></span>
<el-input v-model="searchData.qcOperator" class="input-small" style="width: 200px;" @keyup.enter.native="getMainData"/>
<el-form-item label="QC人员" class="search-item">
<el-input v-model="searchData.qcOperator" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="建议验货日期" >
<el-form-item label="建议验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div> </div>
<!-- 第三行 -->
<div class="search-row"> <div class="search-row">
<el-form-item label="申请单号">
<el-input v-model="searchData.requestNo" class="input-small" @keyup.enter.native="getMainData"/>
<el-form-item label="申请单号" class="search-item">
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item> </el-form-item>
<el-form-item label="计划验货日期">
<el-form-item label="计划验货日期" class="search-item">
<div class="date-range"> <div class="date-range">
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" class="date-small"/>
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 100px"/>
<span class="split">-</span> <span class="split">-</span>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" class="date-small"/>
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div> </div>
</el-form-item> </el-form-item>
</div>
<!-- 按钮 -->
<div class="search-btn-row">
<el-button type="primary" class="customer-bun-min" @click="getMainData">查询</el-button>
<el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData" style="">查询</el-button>
</el-form-item>
</div> </div>
</el-form> </el-form>
@ -565,46 +552,55 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
// -
// - ,
.schedule-page-container { .schedule-page-container {
height: calc(100vh - 120px); height: calc(100vh - 120px);
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 10px;
background: #f5f7fa;
padding: 0;
background: #fff;
} }
.search-form-inline { .search-form-inline {
padding: 8px 15px;
padding: 0 5px 5px 5px;
background: #fff; background: #fff;
border-radius: 4px; border-radius: 4px;
margin-bottom: 8px;
margin-bottom: 2px;
flex-shrink: 0; flex-shrink: 0;
} }
.search-row { .search-row {
display: flex; display: flex;
align-items: center;
align-items: flex-end;
flex-wrap: nowrap; flex-wrap: nowrap;
gap: 15px;
}
.search-item {
flex: none;
margin-bottom: 4px; margin-bottom: 4px;
} }
.search-btn-row {
margin-top: 6px;
padding-left: 8px;
.search-btn-item {
flex: none;
margin-bottom: 4px;
} }
.input-small {
width: 110px;
.search-btn-item /deep/ .el-form-item__content {
line-height: normal;
} }
.input-mini {
width: 90px;
.search-item /deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-bottom: 5px;
line-height: 1;
height: auto;
} }
.date-small {
width: 100px;
.search-item /deep/ .el-form-item__content {
line-height: normal;
} }
.date-range { .date-range {
@ -612,51 +608,12 @@ export default {
align-items: center; align-items: center;
} }
.date-small {
width: 130px;
}
.split { .split {
padding: 0 6px; padding: 0 6px;
color: #606266; color: #606266;
font-size: 13px; font-size: 13px;
} }
/deep/ .el-form-item {
margin-right: 15px;
margin-bottom: 4px;
}
/deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-right: 8px;
line-height: 28px;
font-weight: 500;
}
/deep/ .el-form-item__content {
line-height: normal;
}
/deep/ .el-input__inner {
height: 28px;
line-height: 28px;
}
/deep/ .el-date-editor .el-input__inner {
padding-right: 10px;
padding-left: 10px;
}
/deep/ .el-date-editor .el-input__prefix {
display: none;
}
/deep/ .el-date-editor .el-input__suffix {
display: none;
}
// - // -
/deep/ .el-table { /deep/ .el-table {
margin-bottom: 5px; margin-bottom: 5px;
@ -688,4 +645,5 @@ export default {
padding: 10px !important; padding: 10px !important;
} }
} }
</style> </style>

518
src/views/modules/inspection/srmFeeList.vue

@ -0,0 +1,518 @@
<template>
<div class="customer-css">
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="费用单号" class="search-item">
<el-input v-model="searchData.feeNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="申请人" class="search-item" >
<el-input v-model="searchData.applyUser" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="费用日期" class="search-item">
<el-date-picker
v-model="searchData.feeDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData" style="">查询</el-button>
<el-button @click="handleAdd" type="primary" style="margin-left: 2px">新增</el-button>
</el-form-item>
</div>
</el-form>
<el-table
:height="height"
:data="mainDataList"
border
ref="mainTable"
highlight-current-row
@row-click="changeData"
v-loading="dataListLoading"
style="width: 100%;">
<el-table-column
v-for="(item,index) in columnArray1" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="150" label="操作">
<template slot-scope="scope">
<el-link type="primary" style="cursor: pointer; margin-right: 10px;" @click="handleEdit(scope.row)">编辑</el-link>
<el-link type="danger" style="cursor: pointer;" @click="handleDelete(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 分页插件 -->
<el-pagination style="margin-top: 0px"
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[20, 50, 100, 200, 500]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 详情页签 -->
<el-tabs v-model="activeTab" style="margin-top: 0px; width: 99%;" @tab-click="handleTabClick" class="customer-tab" type="border-card">
<!-- 费用明细 -->
<el-tab-pane label="费用明细" name="detail">
<fee-detail-tab ref="feeDetailTab" :fee-data="currentRow" :table-height="detailHeight" />
</el-tab-pane>
<!-- 申请单清单 -->
<el-tab-pane label="申请单清单" name="request">
<request-fee-tab ref="requestFeeTab" :fee-data="currentRow" :table-height="detailHeight" />
</el-tab-pane>
</el-tabs>
<!-- 新增弹窗 -->
<el-dialog
title="新增费用记录"
:visible.sync="addDialogVisible"
width="30%"
top="10vh"
:close-on-click-modal="false">
<el-form :model="addFormData" :rules="addRules" ref="addFormData" label-width="100px" size="small" label-position="top">
<el-form-item label="费用日期" prop="feeDate" >
<el-date-picker
v-model="addFormData.feeDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 50%">
</el-date-picker>
</el-form-item>
<el-form-item label="申请人" prop="applyUser">
<el-input v-model="addFormData.applyUser" placeholder="请输入申请人" style="width: 50%"></el-input>
</el-form-item>
<el-form-item label="备注">
<el-input
type="textarea"
v-model="addFormData.remark"
:autosize="{ minRows: 3, maxRows: 6 }"
placeholder="请输入备注">
</el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSaveAdd">保存</el-button>
<el-button @click="addDialogVisible = false">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { searchFeeHeaderList, createFeeHeader, updateFeeHeader, deleteFeeRecord } from '@/api/inspection/srmFee.js'
import FeeDetailTab from './com_feeDetailTab.vue'
import RequestFeeTab from './com_requestFeeTab.vue'
export default {
name: 'SrmFeeList',
components: {
FeeDetailTab,
RequestFeeTab
},
data() {
return {
functionId: this.$route.meta.menuId,
height: 400,
detailHeight: 400,
currentRow: {},
activeTab: 'detail',
addDialogVisible: false,
addFormData: {
feeDate: '',
applyUser: '',
remark: ''
},
addRules: {
feeDate: [
{ required: true, message: '请选择费用日期', trigger: 'change' }
],
applyUser: [
{ required: true, message: '请输入申请人', trigger: 'blur' }
]
},
searchData: {
feeNo: '',
applyUser: '',
feeDate: '',
site: this.$store.state.user.site,
page: 1,
limit: 50
},
pageIndex: 1,
pageSize: 50,
totalPage: 0,
mainDataList: [],
dataListLoading: false,
columnArray1: [
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1FeeNo',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'feeNo',
headerAlign: 'center',
align: 'left',
columnLabel: '费用单号',
columnWidth: '150',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1FeeDate',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'feeDate',
headerAlign: 'center',
align: 'center',
columnLabel: '费用日期',
columnWidth: '120',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1TotalAmount',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'totalAmount',
headerAlign: 'center',
align: 'right',
columnLabel: '总金额',
columnWidth: '120',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1ApplyUser',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'applyUser',
headerAlign: 'center',
align: 'left',
columnLabel: '申请人',
columnWidth: '100',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1CreatedBy',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'createdBy',
headerAlign: 'center',
align: 'left',
columnLabel: '创建人',
columnWidth: '100',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1CreatedDate',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'createdDate',
headerAlign: 'center',
align: 'center',
columnLabel: '创建时间',
columnWidth: '160',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
},
{
userId: this.$store.state.user.name,
functionId: this.functionId,
serialNumber: 'FeeTable1Remark',
tableId: 'FeeTable1',
tableName: '费用管理',
columnProp: 'remark',
headerAlign: 'center',
align: 'left',
columnLabel: '备注',
columnWidth: '200',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: false
}
]
}
},
mounted() {
this.$nextTick(() => {
this.height = (window.innerHeight - 220) / 2
this.detailHeight = (window.innerHeight - 220) / 2
this.getMainData()
})
},
methods: {
//
getMainData() {
console.log('开始查询费用列表...')
this.searchData.limit = this.pageSize
this.searchData.page = this.pageIndex
this.dataListLoading = true
console.log('设置 loading 为 true')
searchFeeHeaderList(this.searchData).then(({ data }) => {
console.log('接口返回数据:', data)
if (data && data.code === 0) {
this.mainDataList = data.page.list || []
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
this.$nextTick(() => {
if (this.$refs.mainTable) {
this.$refs.mainTable.clearSelection()
}
})
//
if (this.mainDataList.length > 0) {
this.$refs.mainTable.setCurrentRow(this.mainDataList[0])
this.changeData(this.mainDataList[0])
} else {
this.changeData(null)
}
} else {
console.error('查询失败:', data)
this.$message.error((data && data.msg) || '查询失败')
}
this.dataListLoading = false
console.log('设置 loading 为 false')
}).catch((error) => {
console.error('查询费用列表异常:', error)
this.$message.error('查询失败,请稍后重试')
this.dataListLoading = false
console.log('异常处理,设置 loading 为 false')
})
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getMainData()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getMainData()
},
//
changeData(row) {
this.currentRow = row ? JSON.parse(JSON.stringify(row)) : {}
},
//
handleTabClick(tab) {
if (tab.name === 'detail') {
this.$nextTick(() => {
if (this.$refs.feeDetailTab) {
this.$refs.feeDetailTab.loadDetailList()
}
})
} else if (tab.name === 'request') {
this.$nextTick(() => {
if (this.$refs.requestFeeTab) {
this.$refs.requestFeeTab.loadRequestFeeList()
}
})
}
},
//
handleAdd() {
this.addDialogVisible = true
this.addFormData = {
feeDate: '',
applyUser: '',
remark: ''
}
if (this.$refs.addFormData) {
this.$refs.addFormData.clearValidate()
}
},
//
handleSaveAdd() {
this.$refs.addFormData.validate((valid) => {
if (valid) {
const params = {
site: this.$store.state.user.site,
feeDate: this.addFormData.feeDate,
applyUser: this.addFormData.applyUser,
remark: this.addFormData.remark,
createdBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
}
createFeeHeader(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('创建成功')
this.addDialogVisible = false
this.getMainData()
} else {
this.$message.error(data.msg || '创建失败')
}
}).catch(() => {
this.$message.error('创建失败')
})
}
})
},
//
handleEdit(row) {
this.changeData(row)
this.activeTab = 'detail'
this.$nextTick(() => {
if (this.$refs.feeDetailTab) {
this.$refs.feeDetailTab.loadDetailList()
}
})
},
//
handleDelete(row) {
this.$confirm('确定要删除该费用记录吗?删除后将同时删除明细和关联申请单。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
site: row.site,
feeNo: row.feeNo
}
deleteFeeRecord(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.getMainData()
} else {
this.$message.error(data.msg || '删除失败')
}
}).catch(() => {
this.$message.error('删除失败')
})
}).catch(() => {})
}
},
created() {
this.getMainData()
}
}
</script>
<style scoped lang="scss">
.search-form-inline {
background: #fff;
}
.search-row {
display: flex;
align-items: flex-end;
flex-wrap: nowrap;
gap: 15px;
}
.search-item {
flex: none;
margin-bottom: 10px;
}
.search-btn-item {
flex: none;
margin-bottom: 10px;
}
.search-btn-item /deep/ .el-form-item__content {
line-height: normal;
}
.search-item /deep/ .el-form-item__label {
font-size: 13px;
color: #606266;
padding-bottom: 5px;
line-height: 1;
height: auto;
}
.search-item /deep/ .el-form-item__content {
line-height: normal;
}
/deep/ .customer-tab .el-tabs__content {
padding: 5px !important;
}
// inspectionRequestList
.customer-bun-min {
padding: 7px 12px;
font-size: 12px;
border-radius: 3px;
}
</style>
Loading…
Cancel
Save