修复一些已知问题

代码调整
master
toesbieya 6 years ago
parent 6d821998c1
commit 60b9c7fed3
  1. 1
      vue/src/api/doc/baseUrl.js
  2. 8
      vue/src/api/doc/history.js
  3. 3
      vue/src/api/doc/purchase/inbound.js
  4. 3
      vue/src/api/doc/purchase/order.js
  5. 3
      vue/src/api/doc/sell/order.js
  6. 3
      vue/src/api/doc/sell/outbound.js
  7. 7
      vue/src/api/documentHistory.js
  8. 1
      vue/src/api/message/baseUrl.js
  9. 3
      vue/src/api/message/manage.js
  10. 3
      vue/src/api/message/user.js
  11. 1
      vue/src/api/system/baseUrl.js
  12. 3
      vue/src/api/system/category.js
  13. 3
      vue/src/api/system/customer.js
  14. 3
      vue/src/api/system/department.js
  15. 7
      vue/src/api/system/resource.js
  16. 3
      vue/src/api/system/role.js
  17. 3
      vue/src/api/system/supplier.js
  18. 3
      vue/src/api/system/user.js
  19. 65
      vue/src/bizComponents/document/DocHistory.vue
  20. 25
      vue/src/bizComponents/document/DocSteps.vue
  21. 364
      vue/src/components/UploadFile/index.vue
  22. 0
      vue/src/components/biz/CategoryTree/index.vue
  23. 0
      vue/src/components/biz/UserSelector/SimpleMultipleUserSelector.vue
  24. 0
      vue/src/components/biz/UserSelector/index.js
  25. 0
      vue/src/components/biz/doc/DocDetailFooter.vue
  26. 0
      vue/src/components/biz/doc/DocDetailHeader.vue
  27. 96
      vue/src/components/biz/doc/DocHistory.vue
  28. 22
      vue/src/components/biz/doc/DocSteps.vue
  29. 10
      vue/src/mixins/docDetailMixin.js
  30. 0
      vue/src/mixins/docTableMixin.js
  31. 6
      vue/src/router/authority/modules/purchase.js
  32. 6
      vue/src/router/authority/modules/sell.js
  33. 2
      vue/src/views/message/manage/EditDialog.vue
  34. 2
      vue/src/views/purchase/inbound/components/OrderSelector.vue
  35. 8
      vue/src/views/purchase/inbound/detail.vue
  36. 123
      vue/src/views/purchase/inbound/index.vue
  37. 2
      vue/src/views/purchase/order/components/SupplierSelector.vue
  38. 6
      vue/src/views/purchase/order/detail.vue
  39. 157
      vue/src/views/purchase/order/index.vue
  40. 2
      vue/src/views/sell/order/components/CustomerSelector.vue
  41. 8
      vue/src/views/sell/order/detail.vue
  42. 156
      vue/src/views/sell/order/index.vue
  43. 4
      vue/src/views/sell/outbound/components/OrderSelector.vue
  44. 348
      vue/src/views/sell/outbound/detail.vue
  45. 124
      vue/src/views/sell/outbound/index.vue
  46. 2
      vue/src/views/stock/current/index.vue
  47. 2
      vue/src/views/system/category/components/List.vue
  48. 12
      vue/src/views/system/customer/EditDialog.vue
  49. 11
      vue/src/views/system/customer/index.vue
  50. 12
      vue/src/views/system/supplier/EditDialog.vue
  51. 10
      vue/src/views/system/supplier/index.vue

@ -0,0 +1 @@
export default '/doc'

@ -0,0 +1,8 @@
import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `${BASE}/history`
export function searchHistory(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)
}

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from '../baseUrl'
export const baseUrl = '/document/purchase/inbound' export const baseUrl = `${BASE}/purchase/inbound`
export function getById(id) { export function getById(id) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data) return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from '../baseUrl'
export const baseUrl = `/document/sell/order` export const baseUrl = `${BASE}/purchase/order`
export function getById(id) { export function getById(id) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data) return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from '../baseUrl'
export const baseUrl = '/document/purchase/order' export const baseUrl = `${BASE}/sell/order`
export function getById(id) { export function getById(id) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data) return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from '../baseUrl'
export const baseUrl = `/document/sell/outbound` export const baseUrl = `${BASE}/sell/outbound`
export function getById(id) { export function getById(id) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data) return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,7 +0,0 @@
import request from "@/config/request"
export const baseUrl = '/document/history'
export function getDocumentHistoryByPid(pid) {
return request.get(`${baseUrl}/get?pid=${pid}`).then(({data}) => data.data)
}

@ -0,0 +1 @@
export default '/message'

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
const baseUrl = '/message/manage' const baseUrl = `${BASE}/manage`
export function search(data) { export function search(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data) return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = '/message/user' export const baseUrl = `${BASE}/user`
export function search(data) { export function search(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data) return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)

@ -0,0 +1 @@
export default '/system'

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/category` export const baseUrl = `${BASE}/category`
export function search(data) { export function search(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data) return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/customer` export const baseUrl = `${BASE}/customer`
export function getLimitRegion() { export function getLimitRegion() {
return request.get(`${baseUrl}/getLimitRegion`).then(({data}) => data.data) return request.get(`${baseUrl}/getLimitRegion`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/department` export const baseUrl = `${BASE}/department`
export function getDepartments(all = true) { export function getDepartments(all = true) {
return request.get(`${baseUrl}/get?all=${all}`).then(({data}) => data.data) return request.get(`${baseUrl}/get?all=${all}`).then(({data}) => data.data)

@ -1,10 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/resource` export const baseUrl = `${BASE}/resource`
export function getResources() {
return request.get(`${baseUrl}/get`).then(({data}) => data.data)
}
export function getAllResources() { export function getAllResources() {
return request.get(`${baseUrl}/getAll`).then(({data}) => data.data) return request.get(`${baseUrl}/getAll`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/role` export const baseUrl = `${BASE}/role`
export function searchRoles(data) { export function searchRoles(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data) return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/supplier` export const baseUrl = `${BASE}/supplier`
export function getLimitRegion() { export function getLimitRegion() {
return request.get(`${baseUrl}/getLimitRegion`).then(({data}) => data.data) return request.get(`${baseUrl}/getLimitRegion`).then(({data}) => data.data)

@ -1,6 +1,7 @@
import request from "@/config/request" import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/user` export const baseUrl = `${BASE}/user`
export function getUsers(data) { export function getUsers(data) {
return request.post(`${baseUrl}/search`, data).then(({data}) => data.data) return request.post(`${baseUrl}/search`, data).then(({data}) => data.data)

@ -1,65 +0,0 @@
<template>
<collapse-card header="单据历史" style="margin-top: 16px">
<abstract-table v-loading="loading" :data="data" :highlight-current-row="false">
<el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="操作人" prop="uname"/>
<el-table-column align="center" label="操作类型" prop="type"/>
<el-table-column align="center" label="时 间" prop="time"/>
<el-table-column align="center" label="备注" prop="info"/>
</abstract-table>
</collapse-card>
</template>
<script>
import AbstractTable from "@/components/AbstractTable"
import CollapseCard from '@/components/CollapseCard'
import {getDocumentHistoryByPid} from "@/api/documentHistory"
import {isEmpty, timeFormat} from "@/utils"
export default {
name: "DocHistory",
components: {AbstractTable, CollapseCard},
props: {id: String},
data() {
return {
loading: false,
data: []
}
},
watch: {
id: {
immediate: true,
handler(v) {
if (isEmpty(v)) return
getDocumentHistoryByPid(v)
.then(history => {
history.forEach(i => {
i.time = timeFormat(null, new Date(i.time))
let type = null
switch (i.type) {
case 0:
type = '撤回'
break
case 1:
type = '提交'
break
case 2:
type = '通过'
break
case 3:
type = '驳回'
break
}
i.type = type
})
this.data = history
})
}
}
}
}
</script>

@ -1,25 +0,0 @@
<script type="text/jsx">
export default {
name: "DocSteps",
functional: true,
props: {
status: Number,
finish: Number
},
render(h, context) {
const {status, finish} = context.props
const active = status === 2 && (finish === undefined || finish === 2) ? 4 : status
return (
<el-steps align-center active={active}>
<el-step title="填写单据"/>
<el-step title="提交单据,等待审核"/>
<el-step title="审核通过"/>
<el-step title="单据完成"/>
</el-steps>
)
}
}
</script>

@ -1,25 +1,25 @@
<template> <template>
<el-upload <el-upload
ref="upload" ref="upload"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:class="{disabled: hideUploader}" :class="{disabled: hideUploader}"
:file-list="tempData" :file-list="tempData"
:http-request="httpRequest" :http-request="httpRequest"
:limit="limit" :limit="limit"
:multiple="multiple" :multiple="multiple"
:on-error="error" :on-error="error"
:on-exceed="exceed" :on-exceed="exceed"
:on-success="success" :on-success="success"
action="" action=""
list-type="picture-card" list-type="picture-card"
> >
<i class="el-icon-plus"/> <i class="el-icon-plus"/>
<template v-slot:file="{file}"> <template v-slot:file="{file}">
<span <span
class="el-upload-list__item-actions" class="el-upload-list__item-actions"
@mouseenter="e => handleBlockMouseEnter(e,file)" @mouseenter="e => handleBlockMouseEnter(e,file)"
@mouseleave="handleBlockMouseLeave" @mouseleave="handleBlockMouseLeave"
> >
<span class="el-upload-list__item-preview" @click="() => preview(file)"> <span class="el-upload-list__item-preview" @click="() => preview(file)">
<i class="el-icon-zoom-in"/> <i class="el-icon-zoom-in"/>
@ -49,193 +49,193 @@
</template> </template>
<script> <script>
/* /*
* 直传七牛云 * 直传七牛云
* 传入fileList自动拼接七牛云外链前缀并增加downloadUrl属性图片类型的文件url与downloadUrl相同 * 传入fileList自动拼接七牛云外链前缀并增加downloadUrl属性图片类型的文件url与downloadUrl相同
* 非图片类型的文件使用kkFileView预览 * 非图片类型的文件使用kkFileView预览
* successremove事件中的file.url均不带七牛云外链前缀 * successremove事件中的file.url均不带七牛云外链前缀
* */ * */
import axios from 'axios' import axios from 'axios'
import {attachmentPrefix} from '@/config' import {attachmentPrefix} from '@/config'
import {debounce, isEmpty} from '@/utils' import {debounce, isEmpty} from '@/utils'
import {elError} from "@/utils/message" import {elError} from "@/utils/message"
import {isImage, isDoc, isPdf, isPpt, isRar, isXls, isTxt, isZip} from "@/utils/validate" import {isImage, isDoc, isPdf, isPpt, isRar, isXls, isTxt, isZip} from "@/utils/validate"
import {preview, deleteUpload, download, upload, autoCompleteUrl} from "@/utils/file" import {preview, deleteUpload, download, upload, autoCompleteUrl} from "@/utils/file"
const typeMapper = [ const typeMapper = [
{test: isImage}, {test: isDoc, type: 'doc'}, {test: isPdf, type: 'pdf'}, {test: isPpt, type: 'ppt'}, {test: isImage}, {test: isDoc, type: 'doc'}, {test: isPdf, type: 'pdf'}, {test: isPpt, type: 'ppt'},
{test: isRar, type: 'rar'}, {test: isXls, type: 'xls'}, {test: isTxt, type: 'txt'}, {test: isZip, type: 'zip'}, {test: isRar, type: 'rar'}, {test: isXls, type: 'xls'}, {test: isTxt, type: 'txt'}, {test: isZip, type: 'zip'},
] ]
function parseMaxSize(maxSize) { function parseMaxSize(maxSize) {
if (typeof maxSize === 'number') { if (typeof maxSize === 'number') {
return maxSize return maxSize
}
const map = {KB: 1024, MB: 1024 * 1024},
upper = maxSize.toUpperCase(),
num = upper.replace(/[^0-9]/ig, ""),
unit = upper.replace(num, "")
return parseInt(num) * (map[unit] || 1)
}
function getCoverImage(url, fileType) {
const mapper = typeMapper.find(({test}) => test(fileType))
return mapper && mapper.type ? `${process.env.BASE_URL}static/img/fileType/${mapper.type}.png` : url
}
export default {
name: 'UploadFile',
props: {
disabled: Boolean,
multiple: {type: Boolean, default: true},
fileList: {type: Array, default: () => []},
limit: {type: Number, default: 10},
maxSize: {type: [Number, String], default: '10MB'}
},
data() {
return {
tempData: this.fileList,
data: this.fileList,
tooltipContent: null
} }
},
const map = {KB: 1024, MB: 1024 * 1024}, computed: {
upper = maxSize.toUpperCase(), count() {
num = upper.replace(/[^0-9]/ig, ""), return this.data.length
unit = upper.replace(num, "") },
hideUploader() {
return this.disabled || this.count >= this.limit
},
previewUrlList() {
return this.data ? this.data.map(i => i.downloadUrl) : []
}
},
watch: {
fileList: {
immediate: true,
handler(fileList) {
if (isEmpty(fileList)) this.data = []
else {
this.data = [...this.fileList.map(file => {
const downloadUrl = autoCompleteUrl(file.url)
return {...file, url: getCoverImage(downloadUrl, file.name), downloadUrl}
})]
}
this.tempData = JSON.parse(JSON.stringify(this.data))
}
}
},
methods: {
//仿el-tabletooltip
handleBlockMouseEnter(event, file) {
const tooltip = this.$refs.tooltip
this.tooltipContent = file.name
tooltip.referenceElm = event.target
tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none')
tooltip.doDestroy()
tooltip.setExpectedState(true)
this.activateTooltip(tooltip)
},
handleBlockMouseLeave() {
const tooltip = this.$refs.tooltip
if (tooltip) {
tooltip.setExpectedState(false)
tooltip.handleClosePopper()
}
},
return parseInt(num) * (map[unit] || 1) //remove
} remove(file) {
//tooltip
this.handleBlockMouseLeave()
function getCoverImage(url, fileType) { //
const mapper = typeMapper.find(({test}) => test(fileType)) //
if (!file.raw) this.$emit('remove', {url: file.downloadUrl.replace(attachmentPrefix, '')})
//
else if (file.response && !file.response.err) deleteUpload(file.raw.key)
return mapper && mapper.type ? `${process.env.BASE_URL}static/img/fileType/${mapper.type}.png` : url this.$refs.upload.handleRemove(file)
} const index = this.data.findIndex(i => i.downloadUrl === file.downloadUrl)
if (index > -1) this.data.splice(index, 1)
},
export default { //
name: 'UploadFile', preview(file) {
if (!isImage(file.name)) return preview(file.downloadUrl)
props: { const index = this.data.findIndex(i => i.downloadUrl === file.downloadUrl)
disabled: Boolean, this.$image({index, urlList: this.previewUrlList})
multiple: {type: Boolean, default: true},
fileList: {type: Array, default: () => []},
limit: {type: Number, default: 10},
maxSize: {type: Number | String, default: '10MB'}
}, },
data() { //
return { download(file) {
tempData: this.fileList, download(file.downloadUrl, file.name)
data: this.fileList,
tooltipContent: null
}
}, },
computed: { //
count() { exceed() {
return this.data.length elError(`最多只能上传${this.limit}个文件`)
},
hideUploader() {
return this.disabled || this.count >= this.limit
},
previewUrlList() {
return this.data ? this.data.map(i => i.downloadUrl) : []
}
}, },
watch: { //successkey
fileList: { success(res, file) {
immediate: true, file.url = getCoverImage(file.url, file.name)
handler(fileList) { file.raw.key = res.key
if (isEmpty(fileList)) this.data = [] file.downloadUrl = autoCompleteUrl(res.key)
else { this.data.push(file)
this.data = [...this.fileList.map(file => { this.$emit('success', file, res)
const downloadUrl = autoCompleteUrl(file.url)
return {...file, url: getCoverImage(downloadUrl, file.name), downloadUrl}
})]
}
this.tempData = JSON.parse(JSON.stringify(this.data))
}
}
}, },
methods: { //
//仿el-tabletooltip error(err, file) {
handleBlockMouseEnter(event, file) { elError('上传文件失败,' + err)
const tooltip = this.$refs.tooltip file.response.err = err
this.tooltipContent = file.name this.remove(file)
tooltip.referenceElm = event.target },
tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none')
tooltip.doDestroy() //
tooltip.setExpectedState(true) beforeUpload(file) {
this.activateTooltip(tooltip) if (!typeMapper.some(({test}) => test(file.name))) {
}, elError('只支持图片、word、pdf、ppt、rar、excel、txt、zip类型的文件')
handleBlockMouseLeave() { return false
const tooltip = this.$refs.tooltip }
if (tooltip) { const maxSize = parseMaxSize(this.maxSize)
tooltip.setExpectedState(false) if (file.size > maxSize) {
tooltip.handleClosePopper() elError(`${file.name}的大小超出${this.$options.filters.numberFormatter(maxSize)}`)
} return false
},
//remove
remove(file) {
//tooltip
this.handleBlockMouseLeave()
//
//
if (!file.raw) this.$emit('remove', {url: file.downloadUrl.replace(attachmentPrefix, '')})
//
else if (file.response && !file.response.err) deleteUpload(file.raw.key)
this.$refs.upload.handleRemove(file)
const index = this.data.findIndex(i => i.downloadUrl === file.downloadUrl)
if (index > -1) this.data.splice(index, 1)
},
//
preview(file) {
if (!isImage(file.name)) return preview(file.downloadUrl)
const index = this.data.findIndex(i => i.downloadUrl === file.downloadUrl)
this.$image({index, urlList: this.previewUrlList})
},
//
download(file) {
download(file.downloadUrl, file.name)
},
//
exceed() {
elError(`最多只能上传${this.limit}个文件`)
},
//successkey
success(res, file) {
file.url = getCoverImage(file.url, file.name)
file.raw.key = res.key
file.downloadUrl = autoCompleteUrl(res.key)
this.data.push(file)
this.$emit('success', file, res)
},
//
error(err, file) {
elError('上传文件失败,' + err)
file.response.err = err
this.remove(file)
},
//
beforeUpload(file) {
if (!typeMapper.some(({test}) => test(file.name))) {
elError('只支持图片、word、pdf、ppt、rar、excel、txt、zip类型的文件')
return false
}
const maxSize = parseMaxSize(this.maxSize)
if (file.size > maxSize) {
elError(`${file.name}的大小超出${this.$options.filters.numberFormatter(maxSize)}`)
return false
}
},
httpRequest({file, onProgress}) {
const source = axios.CancelToken.source()
const promise = upload(file, file.name, {
onUploadProgress(e) {
if (e.total > 0) {
e.percent = (Number)((e.loaded / e.total * 100).toFixed(2))
}
onProgress(e)
},
cancelToken: source.token
})
//eleajaxabort
promise.abort = source.cancel
return promise
} }
}, },
created() { httpRequest({file, onProgress}) {
this.activateTooltip = debounce(tooltip => tooltip.handleShowPopper(), 200) const source = axios.CancelToken.source()
const promise = upload(file, file.name, {
onUploadProgress(e) {
if (e.total > 0) {
e.percent = (Number)((e.loaded / e.total * 100).toFixed(2))
}
onProgress(e)
},
cancelToken: source.token
})
//eleajaxabort
promise.abort = source.cancel
return promise
} }
},
created() {
this.activateTooltip = debounce(tooltip => tooltip.handleShowPopper(), 200)
} }
}
</script> </script>
<style lang="scss" src="./style.scss"></style> <style lang="scss" src="./style.scss"></style>

@ -0,0 +1,96 @@
<template>
<collapse-card header="单据历史" style="margin-top: 16px">
<abstract-table v-loading="loading" :data="data" :highlight-current-row="false">
<el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="操作人" prop="uname"/>
<el-table-column align="center" label="操作类型" prop="type"/>
<el-table-column align="center" label="时 间" prop="time"/>
<el-table-column align="center" label="备注" prop="info"/>
</abstract-table>
<el-pagination
background
:current-page="searchForm.page"
:page-size="searchForm.pageSize"
:total="searchForm.total"
hide-on-single-page
layout="total, prev, pager, next, jumper"
@current-change="pageChange"
/>
</collapse-card>
</template>
<script>
import AbstractTable from "@/components/AbstractTable"
import CollapseCard from '@/components/CollapseCard'
import {searchHistory} from "@/api/doc/history"
import {isEmpty, timeFormat} from "@/utils"
export default {
name: "DocHistory",
components: {AbstractTable, CollapseCard},
props: {id: String},
data() {
return {
loading: false,
searchForm: {
page: 1,
pageSize: 15,
total: 0
},
data: []
}
},
watch: {
id: {
immediate: true,
handler() {
this.search()
}
}
},
methods: {
search() {
if (isEmpty(this.id)) return
searchHistory({pid: this.id, ...this.searchForm})
.then(({total, list}) => {
this.transformData(list)
this.data = list
this.total = total
})
},
pageChange(v) {
this.searchForm.page = v
this.search()
},
transformData(data) {
data.forEach(i => {
i.time = timeFormat(null, new Date(i.time))
let type = null
switch (i.type) {
case 0:
type = '撤回'
break
case 1:
type = '提交'
break
case 2:
type = '通过'
break
case 3:
type = '驳回'
break
}
i.type = type
})
}
}
}
</script>

@ -0,0 +1,22 @@
<script type="text/jsx">
export default {
name: "DocSteps",
functional: true,
props: {status: Number, finish: Number},
render(h, context) {
const {status, finish} = context.props
const active = status === 2 && (finish === undefined || finish === 2) ? 4 : status
return (
<el-steps align-center active={active === 2 ? 3 : active}>
<el-step title="填写单据"/>
<el-step title="提交单据,等待审核"/>
<el-step title="审核通过"/>
<el-step title="单据完成"/>
</el-steps>
)
}
}
</script>

@ -2,12 +2,12 @@ import AbstractForm from '@/components/AbstractForm'
import AbstractFormItem from "@/components/AbstractForm/AbstractFormItem" import AbstractFormItem from "@/components/AbstractForm/AbstractFormItem"
import AbstractTable from "@/components/AbstractTable" import AbstractTable from "@/components/AbstractTable"
import CollapseCard from '@/components/CollapseCard' import CollapseCard from '@/components/CollapseCard'
import DocDetailHeader from "@/bizComponents/document/DocDetailHeader" import DocDetailHeader from "@/components/biz/doc/DocDetailHeader"
import DocDetailFooter from "@/bizComponents/document/DocDetailFooter" import DocDetailFooter from "@/components/biz/doc/DocDetailFooter"
import DocHistory from '@/bizComponents/document/DocHistory' import DocHistory from '@/components/biz/doc/DocHistory'
import DocSteps from '@/bizComponents/document/DocSteps' import DocSteps from '@/components/biz/doc/DocSteps'
import UploadFile from '@/components/UploadFile' import UploadFile from '@/components/UploadFile'
import {commonMethods} from "@/mixins/bizDocumentTableMixin" import {commonMethods} from "@/mixins/docTableMixin"
import {isEmpty, mergeObj} from '@/utils' import {isEmpty, mergeObj} from '@/utils'
import {elAlert, elConfirm, elPrompt, elSuccess} from "@/utils/message" import {elAlert, elConfirm, elPrompt, elSuccess} from "@/utils/message"
import {deleteUpload} from "@/utils/file" import {deleteUpload} from "@/utils/file"

@ -3,7 +3,7 @@ import Layout from '@/layout'
import {lazyLoadView} from "@/router/util" import {lazyLoadView} from "@/router/util"
const router = { const router = {
path: '/document/purchase', path: '/doc/purchase',
component: Layout, component: Layout,
alwaysShow: true, alwaysShow: true,
meta: {title: '采购管理', icon: 'shopping'}, meta: {title: '采购管理', icon: 'shopping'},
@ -31,7 +31,7 @@ const router = {
return `查看采购订单${id}` return `查看采购订单${id}`
} }
}, },
activeMenu: '/document/purchase/order', activeMenu: '/doc/purchase/order',
isDetailPage: true isDetailPage: true
} }
}, },
@ -58,7 +58,7 @@ const router = {
return `查看采购入库单${id}` return `查看采购入库单${id}`
} }
}, },
activeMenu: '/document/purchase/inbound', activeMenu: '/doc/purchase/inbound',
isDetailPage: true isDetailPage: true
} }
} }

@ -3,7 +3,7 @@ import Layout from '@/layout'
import {lazyLoadView} from "@/router/util" import {lazyLoadView} from "@/router/util"
const router = { const router = {
path: '/document/sell', path: '/doc/sell',
component: Layout, component: Layout,
alwaysShow: true, alwaysShow: true,
meta: {title: '销售管理', icon: 'sell'}, meta: {title: '销售管理', icon: 'sell'},
@ -31,7 +31,7 @@ const router = {
return `查看销售订单${id}` return `查看销售订单${id}`
} }
}, },
activeMenu: '/document/sell/order', activeMenu: '/doc/sell/order',
isDetailPage: true isDetailPage: true
} }
}, },
@ -58,7 +58,7 @@ const router = {
return `查看销售出库单${id}` return `查看销售出库单${id}`
} }
}, },
activeMenu: '/document/outbound/order', activeMenu: '/doc/sell/outbound',
isDetailPage: true isDetailPage: true
} }
} }

@ -56,7 +56,7 @@
import AbstractFormItem from "@/components/AbstractForm/AbstractFormItem" import AbstractFormItem from "@/components/AbstractForm/AbstractFormItem"
import FormDialog from '@/components/FormDialog' import FormDialog from '@/components/FormDialog'
import TinymceEditor from "@/components/TinymceEditor" import TinymceEditor from "@/components/TinymceEditor"
import {SimpleMultipleUserSelector as UserSelector} from '@/bizComponents/UserSelector' import {SimpleMultipleUserSelector as UserSelector} from '@/components/biz/UserSelector'
import dialogMixin from "@/mixins/dialogMixin" import dialogMixin from "@/mixins/dialogMixin"
import {add, update, publish, withdraw} from "@/api/message/manage" import {add, update, publish, withdraw} from "@/api/message/manage"
import {isEmpty, mergeObj, resetObj} from '@/utils' import {isEmpty, mergeObj, resetObj} from '@/utils'

@ -69,7 +69,7 @@
import LinerProgress from '@/components/LinerProgress' import LinerProgress from '@/components/LinerProgress'
import dialogMixin from "@/mixins/dialogMixin" import dialogMixin from "@/mixins/dialogMixin"
import tableMixin from '@/mixins/tablePageMixin' import tableMixin from '@/mixins/tablePageMixin'
import {getSubById, search} from "@/api/document/purchase/order" import {getSubById, search} from "@/api/doc/purchase/order"
import {elError} from "@/utils/message" import {elError} from "@/utils/message"
export default { export default {

@ -78,10 +78,10 @@
</template> </template>
<script> <script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin" import docDetailMixin from "@/mixins/docDetailMixin"
import OrderSelector from './components/OrderSelector' import OrderSelector from './components/OrderSelector'
import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/document/purchase/inbound" import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/doc/purchase/inbound"
import {getSubById as getParentSubById} from "@/api/document/purchase/order" import {getSubById as getParentSubById} from "@/api/doc/purchase/order"
import {isEmpty} from "@/utils" import {isEmpty} from "@/utils"
import {elAlert} from "@/utils/message" import {elAlert} from "@/utils/message"
import {isInteger} from "@/utils/validate" import {isInteger} from "@/utils/validate"
@ -89,7 +89,7 @@
export default { export default {
name: "purchaseInboundDetail", name: "purchaseInboundDetail",
mixins: [bizDocDetailMixin], mixins: [docDetailMixin],
components: {OrderSelector}, components: {OrderSelector},

@ -12,11 +12,11 @@
</search-form-item> </search-form-item>
<search-form-item label="创建时间:"> <search-form-item label="创建时间:">
<el-date-picker <el-date-picker
v-model="temp.ctime" v-model="temp.ctime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="审核人:"> <search-form-item label="审核人:">
@ -24,11 +24,11 @@
</search-form-item> </search-form-item>
<search-form-item label="审核时间:"> <search-form-item label="审核时间:">
<el-date-picker <el-date-picker
v-model="temp.vtime" v-model="temp.vtime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="状 态:"> <search-form-item label="状 态:">
@ -52,9 +52,9 @@
<el-row v-loading="config.loading" class="table-container"> <el-row v-loading="config.loading" class="table-container">
<abstract-table <abstract-table
:data="tableData" :data="tableData"
@row-click="rowClick" @row-click="rowClick"
@expand-change="getSubList" @expand-change="getSubList"
> >
<el-table-column align="center" type="expand"> <el-table-column align="center" type="expand">
<template v-slot="{row}"> <template v-slot="{row}">
@ -70,77 +70,78 @@
<el-table-column align="center" label="单 号" prop="id" width="160" show-overflow-tooltip/> <el-table-column align="center" label="单 号" prop="id" width="160" show-overflow-tooltip/>
<el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/> <el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/>
<el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ctime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ctime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/> <el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/>
<el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.vtime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.vtime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="状 态" width="120"> <el-table-column align="center" label="状 态" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.status===1,success:row.status===2}" class="dot"/> <span :class="{primary:row.status===1,success:row.status===2}" class="dot"/>
{{getStatus(row.status)}} {{ getStatus(row.status) }}
</template> </template>
</el-table-column> </el-table-column>
</abstract-table> </abstract-table>
<el-pagination <el-pagination
background background
:current-page="searchForm.page" :current-page="searchForm.page"
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
:total="searchForm.total" :total="searchForm.total"
layout="total, prev, pager, next, jumper" layout="total, prev, pager, next, jumper"
@current-change="pageChange" @current-change="pageChange"
/> />
</el-row> </el-row>
</el-card> </el-card>
</template> </template>
<script> <script>
import SearchForm from '@/components/SearchForm' import docTableMixin from '@/mixins/docTableMixin'
import SearchFormItem from "@/components/SearchForm/SearchFormItem" import SearchForm from '@/components/SearchForm'
import documentTableMixin from '@/mixins/bizDocumentTableMixin' import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import {baseUrl, del, getSubById, search} from "@/api/document/purchase/inbound" import {baseUrl, del, getSubById, search} from "@/api/doc/purchase/inbound"
export default { export default {
name: "purchaseInbound", name: "purchaseInbound",
mixins: [documentTableMixin], mixins: [docTableMixin],
components: {SearchForm, SearchFormItem}, components: {SearchForm, SearchFormItem},
data() { data() {
return { return {
baseUrl, baseUrl,
api: {search, del, getSubById}, api: {search, del, getSubById},
searchForm: { searchForm: {
pidFuzzy: null pidFuzzy: null
}, },
excel: { excel: {
column: [ column: [
{header: '序号', prop: 'id'}, {header: '序号', prop: 'id'},
{header: '采购订单单号', prop: 'pid', width: 30}, {header: '采购订单单号', prop: 'pid', width: 30},
{header: '创建人', prop: 'cname'}, {header: '创建人', prop: 'cname'},
{header: '创建时间', prop: 'ctime'}, {header: '创建时间', prop: 'ctime'},
{header: '审核人', prop: 'vname'}, {header: '审核人', prop: 'vname'},
{header: '审核时间', prop: 'vtime'}, {header: '审核时间', prop: 'vtime'},
{header: '状态', prop: 'status'}, {header: '状态', prop: 'status'},
{header: '备注', prop: 'remark', width: 50} {header: '备注', prop: 'remark', width: 50}
] ]
}, },
} }
}, },
methods: { methods: {
mergeSearchForm() { mergeSearchForm() {
return { return {
...this.searchForm, ...this.searchForm,
status: this.temp.status.join(','), status: this.temp.status.join(','),
ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null, ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null,
ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null, ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null,
vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null, vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null,
vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null, vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null,
}
} }
} }
} }
}
</script> </script>

@ -37,7 +37,7 @@
> >
<el-table-column align="center" label="#" type="index" width="80"/> <el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="供应商" prop="name" show-overflow-tooltip/> <el-table-column align="center" label="供应商" prop="name" show-overflow-tooltip/>
<el-table-column align="center" label="行政区域" prop="region_name" show-overflow-tooltip/> <el-table-column align="center" label="行政区域" prop="regionName" show-overflow-tooltip/>
<el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/> <el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/>
<el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/> <el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/> <el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>

@ -124,10 +124,10 @@
</template> </template>
<script> <script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin" import docDetailMixin from "@/mixins/docDetailMixin"
import CategorySelector from './components/CategorySelector' import CategorySelector from './components/CategorySelector'
import SupplierSelector from './components/SupplierSelector' import SupplierSelector from './components/SupplierSelector'
import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/document/purchase/order" import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/doc/purchase/order"
import {isEmpty} from "@/utils" import {isEmpty} from "@/utils"
import {mul, plus} from "@/utils/math" import {mul, plus} from "@/utils/math"
import {isInteger} from "@/utils/validate" import {isInteger} from "@/utils/validate"
@ -135,7 +135,7 @@
export default { export default {
name: "purchaseOrderDetail", name: "purchaseOrderDetail",
mixins: [bizDocDetailMixin], mixins: [docDetailMixin],
components: {CategorySelector, SupplierSelector}, components: {CategorySelector, SupplierSelector},

@ -12,11 +12,11 @@
</search-form-item> </search-form-item>
<search-form-item label="创建时间:"> <search-form-item label="创建时间:">
<el-date-picker <el-date-picker
v-model="temp.ctime" v-model="temp.ctime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="审核人:"> <search-form-item label="审核人:">
@ -24,11 +24,11 @@
</search-form-item> </search-form-item>
<search-form-item label="审核时间:"> <search-form-item label="审核时间:">
<el-date-picker <el-date-picker
v-model="temp.vtime" v-model="temp.vtime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="状 态:"> <search-form-item label="状 态:">
@ -47,11 +47,11 @@
</search-form-item> </search-form-item>
<search-form-item label="结束时间:"> <search-form-item label="结束时间:">
<el-date-picker <el-date-picker
v-model="temp.ftime" v-model="temp.ftime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
</search-form> </search-form>
@ -68,9 +68,9 @@
<el-row v-loading="config.loading" class="table-container"> <el-row v-loading="config.loading" class="table-container">
<abstract-table <abstract-table
:data="tableData" :data="tableData"
@row-click="rowClick" @row-click="rowClick"
@expand-change="getSubList" @expand-change="getSubList"
> >
<el-table-column align="center" type="expand"> <el-table-column align="center" type="expand">
<template v-slot="{row}"> <template v-slot="{row}">
@ -89,91 +89,96 @@
<el-table-column align="center" label="供应商" prop="sname" show-overflow-tooltip/> <el-table-column align="center" label="供应商" prop="sname" show-overflow-tooltip/>
<el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/> <el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/>
<el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ctime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ctime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/> <el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/>
<el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.vtime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.vtime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="状 态" width="120"> <el-table-column align="center" label="状 态" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.status===1,success:row.status===2}" class="dot"/> <span :class="{primary:row.status===1,success:row.status===2}" class="dot"/>
{{getStatus(row.status)}} {{ getStatus(row.status) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="完成情况" width="120"> <el-table-column align="center" label="完成情况" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.finish===1,success:row.finish===2}" class="dot"/> <span :class="{primary:row.finish===1,success:row.finish===2}" class="dot"/>
{{getFinish(row.finish)}} {{ getFinish(row.finish) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="完成时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="完成时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ftime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ftime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
</abstract-table> </abstract-table>
<el-pagination <el-pagination
background background
:current-page="searchForm.page" :current-page="searchForm.page"
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
:total="searchForm.total" :total="searchForm.total"
layout="total, prev, pager, next, jumper" layout="total, prev, pager, next, jumper"
@current-change="pageChange" @current-change="pageChange"
/> />
</el-row> </el-row>
</el-card> </el-card>
</template> </template>
<script> <script>
import SearchForm from '@/components/SearchForm' import docTableMixin from '@/mixins/docTableMixin'
import SearchFormItem from "@/components/SearchForm/SearchFormItem" import SearchForm from '@/components/SearchForm'
import documentTableMixin from '@/mixins/bizDocumentTableMixin' import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import {baseUrl, del, getSubById, search} from "@/api/document/purchase/order" import {baseUrl, del, getSubById, search} from "@/api/doc/purchase/order"
export default { export default {
name: "purchaseOrder", name: "purchaseOrder",
mixins: [documentTableMixin],
components: {SearchForm, SearchFormItem}, mixins: [docTableMixin],
data() {
return { components: {SearchForm, SearchFormItem},
baseUrl,
searchForm: { data() {
sname: null return {
}, baseUrl,
temp: { searchForm: {
finish: [], sname: null
ftime: [] },
}, temp: {
api: {search, del, getSubById}, finish: [],
excel: { ftime: []
column: [ },
{header: '序号', prop: 'id'}, api: {search, del, getSubById},
{header: '供应商', prop: 'sname', width: 30}, excel: {
{header: '创建人', prop: 'cname'}, column: [
{header: '创建时间', prop: 'ctime'}, {header: '序号', prop: 'id'},
{header: '审核人', prop: 'vname'}, {header: '供应商', prop: 'sname', width: 30},
{header: '审核时间', prop: 'vtime'}, {header: '创建人', prop: 'cname'},
{header: '状态', prop: 'status'}, {header: '创建时间', prop: 'ctime'},
{header: '完成情况', prop: 'finish'}, {header: '审核人', prop: 'vname'},
{header: '完成时间', prop: 'ftime'}, {header: '审核时间', prop: 'vtime'},
{header: '备注', prop: 'remark', width: 50} {header: '状态', prop: 'status'},
] {header: '完成情况', prop: 'finish'},
} {header: '完成时间', prop: 'ftime'},
{header: '备注', prop: 'remark', width: 50}
]
} }
}, }
methods: { },
mergeSearchForm() {
return { methods: {
...this.searchForm, mergeSearchForm() {
status: this.temp.status.join(','), return {
finish: this.temp.finish.join(','), ...this.searchForm,
ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null, status: this.temp.status.join(','),
ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null, finish: this.temp.finish.join(','),
vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null, ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null,
vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null, ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null,
ftimeStart: this.temp.ftime ? this.temp.ftime[0] : null, vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null,
ftimeEnd: this.temp.ftime ? this.temp.ftime[1] + 86400000 : null, vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null,
} ftimeStart: this.temp.ftime ? this.temp.ftime[0] : null,
ftimeEnd: this.temp.ftime ? this.temp.ftime[1] + 86400000 : null,
} }
} }
} }
}
</script> </script>

@ -22,7 +22,7 @@
<abstract-table :data="tableData" @row-click="rowClick" @row-dblclick="dbclick"> <abstract-table :data="tableData" @row-click="rowClick" @row-dblclick="dbclick">
<el-table-column align="center" label="#" type="index" width="80"/> <el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="客 户" prop="name" show-overflow-tooltip/> <el-table-column align="center" label="客 户" prop="name" show-overflow-tooltip/>
<el-table-column align="center" label="行政区域" prop="region_name" show-overflow-tooltip/> <el-table-column align="center" label="行政区域" prop="regionName" show-overflow-tooltip/>
<el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/> <el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/>
<el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/> <el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/> <el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>

@ -9,7 +9,7 @@
<abstract-form :model="form" :rules="rules"> <abstract-form :model="form" :rules="rules">
<collapse-card header="流程进度"> <collapse-card header="流程进度">
<doc-steps :status="form.status" :type="type"/> <doc-steps :status="form.status" :finish="form.finish" :type="type"/>
</collapse-card> </collapse-card>
<collapse-card header="基础信息"> <collapse-card header="基础信息">
@ -109,10 +109,10 @@
</template> </template>
<script> <script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin" import docDetailMixin from "@/mixins/docDetailMixin"
import CustomerSelector from './components/CustomerSelector' import CustomerSelector from './components/CustomerSelector'
import StockSelector from './components/StockSelector' import StockSelector from './components/StockSelector'
import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/document/sell/order" import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/doc/sell/order"
import {isEmpty} from "@/utils" import {isEmpty} from "@/utils"
import {mul, plus} from "@/utils/math" import {mul, plus} from "@/utils/math"
import {isInteger} from "@/utils/validate" import {isInteger} from "@/utils/validate"
@ -120,7 +120,7 @@
export default { export default {
name: "sellOrderDetail", name: "sellOrderDetail",
mixins: [bizDocDetailMixin], mixins: [docDetailMixin],
components: {CustomerSelector, StockSelector}, components: {CustomerSelector, StockSelector},

@ -12,11 +12,11 @@
</search-form-item> </search-form-item>
<search-form-item label="创建时间:"> <search-form-item label="创建时间:">
<el-date-picker <el-date-picker
v-model="temp.ctime" v-model="temp.ctime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="审核人:"> <search-form-item label="审核人:">
@ -24,11 +24,11 @@
</search-form-item> </search-form-item>
<search-form-item label="审核时间:"> <search-form-item label="审核时间:">
<el-date-picker <el-date-picker
v-model="temp.vtime" v-model="temp.vtime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="状 态:"> <search-form-item label="状 态:">
@ -47,11 +47,11 @@
</search-form-item> </search-form-item>
<search-form-item label="结束时间:"> <search-form-item label="结束时间:">
<el-date-picker <el-date-picker
v-model="temp.ftime" v-model="temp.ftime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
</search-form> </search-form>
@ -63,11 +63,11 @@
<el-button v-if="canUpdate" icon="el-icon-edit" size="small" type="primary" @click="edit"> </el-button> <el-button v-if="canUpdate" icon="el-icon-edit" size="small" type="primary" @click="edit"> </el-button>
<el-button v-if="canDel" icon="el-icon-delete" size="small" type="danger" @click="del"> </el-button> <el-button v-if="canDel" icon="el-icon-delete" size="small" type="danger" @click="del"> </el-button>
<el-button <el-button
v-if="canExport" v-if="canExport"
icon="el-icon-download" icon="el-icon-download"
size="small" size="small"
type="info" type="info"
@click="downloadExcel" @click="downloadExcel"
> >
</el-button> </el-button>
@ -92,96 +92,96 @@
<el-table-column align="center" label="客 户" prop="customerName" show-overflow-tooltip/> <el-table-column align="center" label="客 户" prop="customerName" show-overflow-tooltip/>
<el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/> <el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/>
<el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ctime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ctime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/> <el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/>
<el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.vtime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.vtime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="状 态" width="120"> <el-table-column align="center" label="状 态" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.status===1,success:row.status===2}" class="dot"/> <span :class="{primary:row.status===1,success:row.status===2}" class="dot"/>
{{getStatus(row.status)}} {{ getStatus(row.status) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="完成情况" width="120"> <el-table-column align="center" label="完成情况" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.finish===1,success:row.finish===2}" class="dot"/> <span :class="{primary:row.finish===1,success:row.finish===2}" class="dot"/>
{{getFinish(row.finish)}} {{ getFinish(row.finish) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="完成时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="完成时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ftime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ftime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
</abstract-table> </abstract-table>
<el-pagination <el-pagination
background background
:current-page="searchForm.page" :current-page="searchForm.page"
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
:total="searchForm.total" :total="searchForm.total"
layout="total, prev, pager, next, jumper" layout="total, prev, pager, next, jumper"
@current-change="pageChange" @current-change="pageChange"
/> />
</el-row> </el-row>
</el-card> </el-card>
</template> </template>
<script> <script>
import SearchForm from '@/components/SearchForm' import docTableMixin from '@/mixins/docTableMixin'
import SearchFormItem from "@/components/SearchForm/SearchFormItem" import SearchForm from '@/components/SearchForm'
import documentTableMixin from '@/mixins/bizDocumentTableMixin' import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import {baseUrl, del, getSubById, search} from "@/api/document/sell/order" import {baseUrl, del, getSubById, search} from "@/api/doc/sell/order"
export default { export default {
name: "sellOrder", name: "sellOrder",
mixins: [documentTableMixin], mixins: [docTableMixin],
components: {SearchForm, SearchFormItem}, components: {SearchForm, SearchFormItem},
data() { data() {
return { return {
baseUrl, baseUrl,
searchForm: { searchForm: {
customerName: null customerName: null
}, },
temp: { temp: {
finish: [], finish: [],
ftime: [] ftime: []
}, },
api: {search, del, getSubById}, api: {search, del, getSubById},
excel: { excel: {
column: [ column: [
{header: '序号', prop: 'id'}, {header: '序号', prop: 'id'},
{header: '客户', prop: 'customerName', width: 30}, {header: '客户', prop: 'customerName', width: 30},
{header: '创建人', prop: 'cname'}, {header: '创建人', prop: 'cname'},
{header: '创建时间', prop: 'ctime'}, {header: '创建时间', prop: 'ctime'},
{header: '审核人', prop: 'vname'}, {header: '审核人', prop: 'vname'},
{header: '审核时间', prop: 'vtime'}, {header: '审核时间', prop: 'vtime'},
{header: '状态', prop: 'status'}, {header: '状态', prop: 'status'},
{header: '完成情况', prop: 'finish'}, {header: '完成情况', prop: 'finish'},
{header: '完成时间', prop: 'ftime'}, {header: '完成时间', prop: 'ftime'},
{header: '备注', prop: 'remark', width: 50} {header: '备注', prop: 'remark', width: 50}
] ]
}
} }
}, }
},
methods: { methods: {
mergeSearchForm() { mergeSearchForm() {
return { return {
...this.searchForm, ...this.searchForm,
status: this.temp.status.join(','), status: this.temp.status.join(','),
finish: this.temp.finish.join(','), finish: this.temp.finish.join(','),
ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null, ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null,
ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null, ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null,
vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null, vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null,
vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null, vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null,
ftimeStart: this.temp.ftime ? this.temp.ftime[0] : null, ftimeStart: this.temp.ftime ? this.temp.ftime[0] : null,
ftimeEnd: this.temp.ftime ? this.temp.ftime[1] + 86400000 : null, ftimeEnd: this.temp.ftime ? this.temp.ftime[1] + 86400000 : null,
}
} }
} }
} }
}
</script> </script>

@ -42,7 +42,7 @@
size="small" size="small"
style="margin-top: 10px" style="margin-top: 10px"
type="primary" type="primary"
@click="confirm(row)" @click="() => confirm(row)"
> >
确定 确定
</el-button> </el-button>
@ -69,7 +69,7 @@
import LinerProgress from '@/components/LinerProgress' import LinerProgress from '@/components/LinerProgress'
import dialogMixin from "@/mixins/dialogMixin" import dialogMixin from "@/mixins/dialogMixin"
import tableMixin from '@/mixins/tablePageMixin' import tableMixin from '@/mixins/tablePageMixin'
import {getSubById, search} from "@/api/document/sell/order" import {getSubById, search} from "@/api/doc/sell/order"
import {elError} from "@/utils/message" import {elError} from "@/utils/message"
export default { export default {

@ -1,15 +1,15 @@
<template> <template>
<div v-loading="loading" class="detail-page"> <div v-loading="loading" class="detail-page">
<doc-detail-header <doc-detail-header
:title="this.title" :title="this.title"
:description="headerDescription" :description="headerDescription"
:extra="headerExtra" :extra="headerExtra"
@close="close" @close="close"
/> />
<abstract-form :model="form" :rules="rules"> <abstract-form :model="form" :rules="rules">
<collapse-card header="流程进度"> <collapse-card header="流程进度">
<doc-steps :status="form.status" :finish="form.finish" :type="type"/> <doc-steps :status="form.status" :type="type"/>
</collapse-card> </collapse-card>
<collapse-card header="基础信息"> <collapse-card header="基础信息">
@ -17,12 +17,12 @@
<el-input v-if="canSave" :value="form.pid" readonly> <el-input v-if="canSave" :value="form.pid" readonly>
<el-button slot="append" @click="parentDialog=true">选择</el-button> <el-button slot="append" @click="parentDialog=true">选择</el-button>
</el-input> </el-input>
<template v-else>{{form.pid}}</template> <template v-else>{{ form.pid }}</template>
</abstract-form-item> </abstract-form-item>
</collapse-card> </collapse-card>
<collapse-card header="出库商品"> <collapse-card header="出库商品">
<abstract-table :data="form.data" :highlight-current-row="false"> <abstract-table :data="displayTableData" :highlight-current-row="false">
<el-table-column align="center" type="expand"> <el-table-column align="center" type="expand">
<el-table slot-scope="{row}" :data="row.data" border show-summary <el-table slot-scope="{row}" :data="row.data" border show-summary
:summary-method="summaryStock(row)"> :summary-method="summaryStock(row)">
@ -35,14 +35,14 @@
</template> </template>
<template v-slot="d"> <template v-slot="d">
<el-input-number <el-input-number
v-if="canSave" v-if="canSave"
v-model="d.row.num" v-model="d.row.num"
controls-position="right" controls-position="right"
:min="0" :min="0"
size="small" size="small"
@change="(nv,ov)=>changeOutboundNum(nv,ov,d.row,row)" @change="(nv,ov)=>changeOutboundNum(nv,ov,d.row,row)"
/> />
<span v-else>{{d.row.num}}</span> <span v-else>{{ d.row.num }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="采购订单" prop="cgddid" show-overflow-tooltip/> <el-table-column align="center" label="采购订单" prop="cgddid" show-overflow-tooltip/>
@ -58,21 +58,21 @@
<collapse-card header="附件"> <collapse-card header="附件">
<upload-file <upload-file
:file-list="form.imageList" :file-list="form.imageList"
:disabled="!canSave" :disabled="!canSave"
@remove="removeUpload" @remove="removeUpload"
@success="uploadSuccess" @success="uploadSuccess"
/> />
</collapse-card> </collapse-card>
<collapse-card header="备注"> <collapse-card header="备注">
<el-input <el-input
v-model="form.remark" v-model="form.remark"
:rows="4" :rows="4"
:readonly="!canSave" :readonly="!canSave"
maxlength="200" maxlength="200"
show-word-limit show-word-limit
type="textarea" type="textarea"
/> />
</collapse-card> </collapse-card>
</abstract-form> </abstract-form>
@ -95,180 +95,180 @@
</template> </template>
<script> <script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin" import docDetailMixin from "@/mixins/docDetailMixin"
import OrderSelector from "./components/OrderSelector" import OrderSelector from "./components/OrderSelector"
import StockSelector from "./components/StockSelector" import StockSelector from "./components/StockSelector"
import {getDetailById as getStockDetail} from "@/api/stock/current" import {getDetailById as getStockDetail} from "@/api/stock/current"
import {getSubById as getParentSubById} from "@/api/document/sell/order" import {getSubById as getParentSubById} from "@/api/doc/sell/order"
import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/document/sell/outbound" import {baseUrl, add, commit, getById, pass, reject, update, withdraw} from "@/api/doc/sell/outbound"
import {isEmpty} from "@/utils" import {isEmpty} from "@/utils"
import {plus, sub} from "@/utils/math" import {plus, sub} from "@/utils/math"
import {elAlert} from "@/utils/message" import {elAlert} from "@/utils/message"
import {isInteger} from "@/utils/validate" import {isInteger} from "@/utils/validate"
export default { export default {
name: "sellOutboundDetail", name: "sellOutboundDetail",
mixins: [bizDocDetailMixin], mixins: [docDetailMixin],
components: {OrderSelector, StockSelector}, components: {OrderSelector, StockSelector},
data() { data() {
return { return {
baseUrl, baseUrl,
docName: '销售出库单', docName: '销售出库单',
api: { api: {
getById, add, update, commit, withdraw, pass, reject getById, add, update, commit, withdraw, pass, reject
},
form: {
pid: null
},
rules: {
pid: [{required: true, message: '请选择销售订单', trigger: 'change'}]
},
stockDialog: false,
row: null,
parentDialog: false,
displayTableData: []
}
},
computed: {
headerDescription() {
const f = this.$options.filters.timestamp2Date
return [
{label: '创建人:', content: this.form.cname},
{label: '创建时间:', content: f(this.form.ctime)},
{label: '审核人:', content: this.form.vname},
{label: '审核时间:', content: f(this.form.vtime)}
]
}, },
headerExtra() { form: {
return [ pid: null
{title: '单据状态', content: this.getStatus(this.form.status)} },
] rules: {
} pid: [{required: true, message: '请选择销售订单', trigger: 'change'}]
},
stockDialog: false,
row: null,
parentDialog: false,
displayTableData: []
}
},
computed: {
headerDescription() {
const f = this.$options.filters.timestamp2Date
return [
{label: '创建人:', content: this.form.cname},
{label: '创建时间:', content: f(this.form.ctime)},
{label: '审核人:', content: this.form.vname},
{label: '审核时间:', content: f(this.form.vtime)}
]
}, },
headerExtra() {
return [
{title: '单据状态', content: this.getStatus(this.form.status)}
]
}
},
methods: { methods: {
afterInit() { afterInit() {
if (this.type === 'add') return if (this.type === 'add') return
let ids = this.form.data.map(i => i.sid).join(',') const ids = this.form.data.map(i => i.sid).join(',')
return Promise.all([ return Promise.all([
getParentSubById(this.form.pid), getParentSubById(this.form.pid),
getStockDetail(ids) getStockDetail(ids)
]) ])
.then(([r1, r2]) => this.buildDisplayTableData(r1, r2)) .then(([r1, r2]) => this.buildDisplayTableData(r1, r2))
}, },
// //
buildDisplayTableData(orderSubList, stockList) { buildDisplayTableData(orderSubList, stockList) {
this.displayTableData = [] this.displayTableData = []
let group = {} const group = {}
this.form.data.forEach(i => { this.form.data.forEach(i => {
if (group[i.cid] === undefined) group[i.cid] = [] if (group[i.cid] === undefined) group[i.cid] = []
let stock = stockList.find(j => j.id === i.sid) let stock = stockList.find(j => j.id === i.sid)
group[i.cid].push({ group[i.cid].push({
...i, ...i,
cgddid: stock ? stock.cgddid : null, cgddid: stock ? stock.cgddid : null,
cgrkid: stock ? stock.cgrkid : null, cgrkid: stock ? stock.cgrkid : null,
max_num: stock ? stock.num : 0 maxNum: stock ? stock.num : 0
})
})
orderSubList.forEach(i => {
if (group[i.cid]) {
let num = plus(...group[i.cid].map(j => j.num))
this.displayTableData.push({...i, num, data: group[i.cid]})
delete group[i.cid]
}
}) })
if (Object.keys(group).length > 0) { })
elAlert('出库商品不符合销售订单,请重新选择', () => { orderSubList.forEach(i => {
this.displayTableData = [] if (group[i.cid]) {
this.form.data = [] let num = plus(...group[i.cid].map(j => j.num))
}) this.displayTableData.push({...i, num, data: group[i.cid]})
delete group[i.cid]
} }
}, })
if (Object.keys(group).length > 0) {
selectParent(id, sub) { elAlert('出库商品不符合销售订单,请重新选择', () => {
this.form.pid = id this.displayTableData = []
this.displayTableData = sub.map(i => ({...i, num: 0, data: []})) this.form.data = []
}, })
}
},
openStock(row) { selectParent(id, sub) {
this.row = row this.form.pid = id
this.stockDialog = true this.displayTableData = sub.map(i => ({...i, num: 0, data: []}))
}, },
selectStock(stocks) { openStock(row) {
let res = [] this.row = row
let outboundNum = 0 this.stockDialog = true
let remainNum = this.row.remainNum },
for (let stock of stocks) {
if (remainNum <= 0) break
let item = {
...stock,
sid: stock.id,
pid: this.form.id,
max_num: stock.num,
num: stock.num > remainNum ? remainNum : stock.num
}
outboundNum = plus(outboundNum, item.num)
res.push(item)
remainNum -= stock.num
}
this.row.num = outboundNum
this.row.data = res
this.stockDialog = false
},
summaryStock(row) { selectStock(stocks) {
return ({data}) => { let res = []
let sum = ['合计', 0, '', ''] let outboundNum = 0
data.forEach(i => { let remainNum = this.row.remainNum
sum[1] = plus(sum[1], i.num) for (let stock of stocks) {
}) if (remainNum <= 0) break
row.num = sum[1] let item = {
return sum ...stock,
sid: stock.id,
pid: this.form.id,
maxNum: stock.num,
num: stock.num > remainNum ? remainNum : stock.num
} }
}, outboundNum = plus(outboundNum, item.num)
res.push(item)
remainNum -= stock.num
}
this.row.num = outboundNum
this.row.data = res
this.stockDialog = false
},
changeOutboundNum(nv, ov, row, displayTableRow) { summaryStock(row) {
if (nv > row.max_num) { return ({data}) => {
return elAlert(`${row.cname}的出库数量超出库存数量`, () => row.num = ov) let sum = ['合计', 0, '', '']
} data.forEach(i => {
sum[1] = plus(sum[1], i.num)
})
row.num = sum[1]
return sum
}
},
let outboundNum = displayTableRow.data.map(i => i.num) changeOutboundNum(nv, ov, row, displayTableRow) {
outboundNum = outboundNum.length === 0 ? 0 : plus(...outboundNum) if (nv > row.maxNum) {
return elAlert(`${row.cname}的出库数量超出库存数量`, () => row.num = ov)
}
if (!outboundNum) return let outboundNum = displayTableRow.data.map(i => i.num)
outboundNum = outboundNum.length === 0 ? 0 : plus(...outboundNum)
if (outboundNum > displayTableRow.remainNum) { if (!outboundNum) return
let correctNum = sub(displayTableRow.remainNum, sub(outboundNum, nv))
if (correctNum < 0) correctNum = 0
else if (correctNum > row.max_num) correctNum = row.max_num
return elAlert(`${displayTableRow.cname}的出库数量超出销售数量`, () => row.num = ov)
}
},
validate() { if (outboundNum > displayTableRow.remainNum) {
if (this.type === 'edit' && isEmpty(this.form.id)) { let correctNum = sub(displayTableRow.remainNum, sub(outboundNum, nv))
return '属性缺失,请关闭弹窗刷新重试' if (correctNum < 0) correctNum = 0
} else if (correctNum > row.maxNum) correctNum = row.maxNum
return elAlert(`${displayTableRow.cname}的出库数量超出销售数量`, () => row.num = ov)
}
},
this.form.data = this.displayTableData.reduce((arr, i) => arr.concat(i.data), []) validate() {
if (this.type === 'edit' && isEmpty(this.form.id)) {
return '属性缺失,请关闭弹窗刷新重试'
}
if (this.form.data.length <= 0) return '出库商品不能为空' this.form.data = this.displayTableData.reduce((arr, i) => arr.concat(i.data), [])
let index = 1 if (this.form.data.length <= 0) return '出库商品不能为空'
for (let sub of this.form.data) {
if (isEmpty(sub.num)) return `${index}个商品的出库数量不能为空`
if (sub.num < 0 || !isInteger(sub.num)) return `${index}个商品的出库数量有误`
index++
}
return null let index = 1
for (let sub of this.form.data) {
if (isEmpty(sub.num)) return `${index}个商品的出库数量不能为空`
if (sub.num < 0 || !isInteger(sub.num)) return `${index}个商品的出库数量有误`
index++
} }
return null
} }
} }
}
</script> </script>

@ -12,11 +12,11 @@
</search-form-item> </search-form-item>
<search-form-item label="创建时间:"> <search-form-item label="创建时间:">
<el-date-picker <el-date-picker
v-model="temp.ctime" v-model="temp.ctime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="审核人:"> <search-form-item label="审核人:">
@ -24,11 +24,11 @@
</search-form-item> </search-form-item>
<search-form-item label="审核时间:"> <search-form-item label="审核时间:">
<el-date-picker <el-date-picker
v-model="temp.vtime" v-model="temp.vtime"
format="yyyy-MM-dd" format="yyyy-MM-dd"
range-separator="-" range-separator="-"
type="daterange" type="daterange"
value-format="timestamp" value-format="timestamp"
/> />
</search-form-item> </search-form-item>
<search-form-item label="状 态:"> <search-form-item label="状 态:">
@ -47,11 +47,11 @@
<el-button v-if="canUpdate" icon="el-icon-edit" size="small" type="primary" @click="edit"> </el-button> <el-button v-if="canUpdate" icon="el-icon-edit" size="small" type="primary" @click="edit"> </el-button>
<el-button v-if="canDel" icon="el-icon-delete" size="small" type="danger" @click="del"> </el-button> <el-button v-if="canDel" icon="el-icon-delete" size="small" type="danger" @click="del"> </el-button>
<el-button <el-button
v-if="canExport" v-if="canExport"
icon="el-icon-download" icon="el-icon-download"
size="small" size="small"
type="info" type="info"
@click="downloadExcel" @click="downloadExcel"
> >
</el-button> </el-button>
@ -73,78 +73,78 @@
<el-table-column align="center" label="单 号" prop="id" width="160" show-overflow-tooltip/> <el-table-column align="center" label="单 号" prop="id" width="160" show-overflow-tooltip/>
<el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/> <el-table-column align="center" label="创建人" prop="cname" show-overflow-tooltip/>
<el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="创建时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.ctime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.ctime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/> <el-table-column align="center" label="审核人" prop="vname" show-overflow-tooltip/>
<el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip> <el-table-column align="center" label="审核时间" width="150" show-overflow-tooltip>
<template v-slot="{row}">{{row.vtime | timestamp2Date}}</template> <template v-slot="{row}">{{ row.vtime | timestamp2Date }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="状 态" width="120"> <el-table-column align="center" label="状 态" width="120">
<template v-slot="{row}"> <template v-slot="{row}">
<span :class="{primary:row.status===1,success:row.status===2}" class="dot"/> <span :class="{primary:row.status===1,success:row.status===2}" class="dot"/>
{{getStatus(row.status)}} {{ getStatus(row.status) }}
</template> </template>
</el-table-column> </el-table-column>
</abstract-table> </abstract-table>
<el-pagination <el-pagination
background background
:current-page="searchForm.page" :current-page="searchForm.page"
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
:total="searchForm.total" :total="searchForm.total"
layout="total, prev, pager, next, jumper" layout="total, prev, pager, next, jumper"
@current-change="pageChange" @current-change="pageChange"
/> />
</el-row> </el-row>
</el-card> </el-card>
</template> </template>
<script> <script>
import SearchForm from '@/components/SearchForm' import docTableMixin from '@/mixins/docTableMixin'
import SearchFormItem from "@/components/SearchForm/SearchFormItem" import SearchForm from '@/components/SearchForm'
import documentTableMixin from '@/mixins/bizDocumentTableMixin' import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import {baseUrl, del, getSubById, search} from "@/api/document/sell/outbound" import {baseUrl, del, getSubById, search} from "@/api/doc/sell/outbound"
export default { export default {
name: "sellOutbound", name: "sellOutbound",
mixins: [documentTableMixin], mixins: [docTableMixin],
components: {SearchForm, SearchFormItem}, components: {SearchForm, SearchFormItem},
data() { data() {
return { return {
baseUrl, baseUrl,
api: {search, del, getSubById}, api: {search, del, getSubById},
searchForm: { searchForm: {
pidFuzzy: null pidFuzzy: null
}, },
excel: { excel: {
column: [ column: [
{header: '序号', prop: 'id'}, {header: '序号', prop: 'id'},
{header: '销售订单单号', prop: 'pid', width: 30}, {header: '销售订单单号', prop: 'pid', width: 30},
{header: '创建人', prop: 'cname'}, {header: '创建人', prop: 'cname'},
{header: '创建时间', prop: 'ctime'}, {header: '创建时间', prop: 'ctime'},
{header: '审核人', prop: 'vname'}, {header: '审核人', prop: 'vname'},
{header: '审核时间', prop: 'vtime'}, {header: '审核时间', prop: 'vtime'},
{header: '状态', prop: 'status'}, {header: '状态', prop: 'status'},
{header: '备注', prop: 'remark', width: 50} {header: '备注', prop: 'remark', width: 50}
] ]
}
} }
}, }
},
methods: { methods: {
mergeSearchForm() { mergeSearchForm() {
return { return {
...this.searchForm, ...this.searchForm,
status: this.temp.status.join(','), status: this.temp.status.join(','),
ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null, ctimeStart: this.temp.ctime ? this.temp.ctime[0] : null,
ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null, ctimeEnd: this.temp.ctime ? this.temp.ctime[1] + 86400000 : null,
vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null, vtimeStart: this.temp.vtime ? this.temp.vtime[0] : null,
vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null, vtimeEnd: this.temp.vtime ? this.temp.vtime[1] + 86400000 : null,
}
} }
} }
} }
}
</script> </script>

@ -67,7 +67,7 @@
</template> </template>
<script> <script>
import CategoryTree from '@/bizComponents/CategoryTree' import CategoryTree from '@/components/biz/CategoryTree'
import DetailDialog from "./DetailDialog" import DetailDialog from "./DetailDialog"
import ExtraArea from '@/components/ExtraArea' import ExtraArea from '@/components/ExtraArea'
import SearchForm from "@/components/SearchForm" import SearchForm from "@/components/SearchForm"

@ -18,7 +18,7 @@
import {del, getAll} from "@/api/system/category" import {del, getAll} from "@/api/system/category"
import ContextMenu from "@/components/ContextMenu" import ContextMenu from "@/components/ContextMenu"
import ContextMenuItem from "@/components/ContextMenu/ContextMenuItem" import ContextMenuItem from "@/components/ContextMenu/ContextMenuItem"
import CategoryTree from '@/bizComponents/CategoryTree' import CategoryTree from '@/components/biz/CategoryTree'
export default { export default {
components: {ContextMenuItem, ContextMenu, CategoryTree}, components: {ContextMenuItem, ContextMenu, CategoryTree},

@ -11,9 +11,9 @@
<el-form-item label="名 称:" prop="name"> <el-form-item label="名 称:" prop="name">
<el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/> <el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/>
</el-form-item> </el-form-item>
<el-form-item label="行政区域:" prop="region_name"> <el-form-item label="行政区域:" prop="regionName">
<region-selector <region-selector
:value="form.region_name" :value="form.regionName"
:readonly="!canEdit" :readonly="!canEdit"
@clear="clearRegion" @clear="clearRegion"
@select="selectRegion" @select="selectRegion"
@ -87,7 +87,7 @@
linkman: null, linkman: null,
linkphone: null, linkphone: null,
region: null, region: null,
region_name: null, regionName: null,
status: 1, status: 1,
remark: null remark: null
}, },
@ -97,7 +97,7 @@
linkman: [{required: true, message: '联系人不能为空', trigger: 'change'}], linkman: [{required: true, message: '联系人不能为空', trigger: 'change'}],
linkphone: [{required: true, message: '联系电话不能为空', trigger: 'change'}], linkphone: [{required: true, message: '联系电话不能为空', trigger: 'change'}],
status: [{required: true, message: '状态不能为空', trigger: 'change'}], status: [{required: true, message: '状态不能为空', trigger: 'change'}],
region_name: [{required: true, message: '行政区域不能为空', trigger: 'change'}], regionName: [{required: true, message: '行政区域不能为空', trigger: 'change'}],
} }
} }
}, },
@ -134,12 +134,12 @@
methods: { methods: {
clearRegion() { clearRegion() {
this.form.region = null this.form.region = null
this.form.region_name = null this.form.regionName = null
}, },
selectRegion(obj) { selectRegion(obj) {
this.form.region = obj.id this.form.region = obj.id
this.form.region_name = obj.fullname this.form.regionName = obj.fullname
}, },
open() { open() {

@ -6,7 +6,7 @@
</search-form-item> </search-form-item>
<search-form-item label="行政区域:"> <search-form-item label="行政区域:">
<region-selector <region-selector
:value="temp.region_name" :value="temp.regionName"
limit limit
:limit-api="getLimitRegion" :limit-api="getLimitRegion"
get-children-on-select get-children-on-select
@ -51,7 +51,7 @@
<abstract-table :data="tableData" @row-click="rowClick"> <abstract-table :data="tableData" @row-click="rowClick">
<el-table-column align="center" label="#" type="index" width="80"/> <el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="客 户" prop="name" show-overflow-tooltip/> <el-table-column align="center" label="客 户" prop="name" show-overflow-tooltip/>
<el-table-column align="center" label="行政区域" prop="region_name" show-overflow-tooltip/> <el-table-column align="center" label="行政区域" prop="regionName" show-overflow-tooltip/>
<el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/> <el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/>
<el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/> <el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/> <el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>
@ -65,6 +65,7 @@
</template> </template>
</el-table-column> </el-table-column>
</abstract-table> </abstract-table>
<el-pagination <el-pagination
background background
:current-page="searchForm.page" :current-page="searchForm.page"
@ -110,7 +111,7 @@
status: null status: null
}, },
temp: { temp: {
region_name: null, regionName: null,
ctime: [] ctime: []
}, },
editDialog: false editDialog: false
@ -138,12 +139,12 @@
clearSidSearch() { clearSidSearch() {
this.searchForm.region = null this.searchForm.region = null
this.temp.region_name = null this.temp.regionName = null
}, },
selectRegion(obj, ids) { selectRegion(obj, ids) {
this.searchForm.region = ids.join(',') this.searchForm.region = ids.join(',')
this.temp.region_name = obj.fullname this.temp.regionName = obj.fullname
}, },
mergeSearchForm() { mergeSearchForm() {

@ -11,9 +11,9 @@
<el-form-item label="名 称:" prop="name"> <el-form-item label="名 称:" prop="name">
<el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/> <el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/>
</el-form-item> </el-form-item>
<el-form-item label="行政区域:" prop="region_name"> <el-form-item label="行政区域:" prop="regionName">
<region-selector <region-selector
:value="form.region_name" :value="form.regionName"
:readonly="!canEdit" :readonly="!canEdit"
@clear="clearRegion" @clear="clearRegion"
@select="selectRegion" @select="selectRegion"
@ -87,7 +87,7 @@
linkman: null, linkman: null,
linkphone: null, linkphone: null,
region: null, region: null,
region_name: null, regionName: null,
status: 1, status: 1,
remark: null remark: null
}, },
@ -97,7 +97,7 @@
linkman: [{required: true, message: '联系人不能为空', trigger: 'change'}], linkman: [{required: true, message: '联系人不能为空', trigger: 'change'}],
linkphone: [{required: true, message: '联系电话不能为空', trigger: 'change'}], linkphone: [{required: true, message: '联系电话不能为空', trigger: 'change'}],
status: [{required: true, message: '状态不能为空', trigger: 'change'}], status: [{required: true, message: '状态不能为空', trigger: 'change'}],
region_name: [{required: true, message: '行政区域不能为空', trigger: 'change'}], regionName: [{required: true, message: '行政区域不能为空', trigger: 'change'}],
} }
} }
}, },
@ -134,12 +134,12 @@
methods: { methods: {
clearRegion() { clearRegion() {
this.form.region = null this.form.region = null
this.form.region_name = null this.form.regionName = null
}, },
selectRegion(obj) { selectRegion(obj) {
this.form.region = obj.id this.form.region = obj.id
this.form.region_name = obj.fullname this.form.regionName = obj.fullname
}, },
open() { open() {

@ -6,7 +6,7 @@
</search-form-item> </search-form-item>
<search-form-item label="行政区域:"> <search-form-item label="行政区域:">
<region-selector <region-selector
:value="temp.region_name" :value="temp.regionName"
limit limit
:limit-api="getLimitRegion" :limit-api="getLimitRegion"
get-children-on-select get-children-on-select
@ -51,7 +51,7 @@
<abstract-table :data="tableData" @row-click="rowClick"> <abstract-table :data="tableData" @row-click="rowClick">
<el-table-column align="center" label="#" type="index" width="80"/> <el-table-column align="center" label="#" type="index" width="80"/>
<el-table-column align="center" label="供应商" prop="name" show-overflow-tooltip/> <el-table-column align="center" label="供应商" prop="name" show-overflow-tooltip/>
<el-table-column align="center" label="行政区域" prop="region_name" show-overflow-tooltip/> <el-table-column align="center" label="行政区域" prop="regionName" show-overflow-tooltip/>
<el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/> <el-table-column align="center" label="地 址" prop="address" show-overflow-tooltip/>
<el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/> <el-table-column align="center" label="联系人" prop="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/> <el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>
@ -111,7 +111,7 @@
status: null status: null
}, },
temp: { temp: {
region_name: null, regionName: null,
ctime: [] ctime: []
}, },
editDialog: false editDialog: false
@ -139,12 +139,12 @@
clearSidSearch() { clearSidSearch() {
this.searchForm.region = null this.searchForm.region = null
this.temp.region_name = null this.temp.regionName = null
}, },
selectRegion(obj, ids) { selectRegion(obj, ids) {
this.searchForm.region = ids.join(',') this.searchForm.region = ids.join(',')
this.temp.region_name = obj.fullname this.temp.regionName = obj.fullname
}, },
mergeSearchForm() { mergeSearchForm() {

Loading…
Cancel
Save