修复一些已知问题

代码调整
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 BASE from '../baseUrl'
export const baseUrl = '/document/purchase/inbound'
export const baseUrl = `${BASE}/purchase/inbound`
export function getById(id) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,6 +1,7 @@
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) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

@ -1,6 +1,7 @@
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) {
return request.get(`${baseUrl}/getById?id=${id}`).then(({data}) => data.data)

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

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

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

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

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

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

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

@ -1,6 +1,7 @@
import request from "@/config/request"
import BASE from './baseUrl'
export const baseUrl = `/system/user`
export const baseUrl = `${BASE}/user`
export function getUsers(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>
<el-upload
ref="upload"
:before-upload="beforeUpload"
:class="{disabled: hideUploader}"
:file-list="tempData"
:http-request="httpRequest"
:limit="limit"
:multiple="multiple"
:on-error="error"
:on-exceed="exceed"
:on-success="success"
action=""
list-type="picture-card"
ref="upload"
:before-upload="beforeUpload"
:class="{disabled: hideUploader}"
:file-list="tempData"
:http-request="httpRequest"
:limit="limit"
:multiple="multiple"
:on-error="error"
:on-exceed="exceed"
:on-success="success"
action=""
list-type="picture-card"
>
<i class="el-icon-plus"/>
<template v-slot:file="{file}">
<span
class="el-upload-list__item-actions"
@mouseenter="e => handleBlockMouseEnter(e,file)"
@mouseleave="handleBlockMouseLeave"
class="el-upload-list__item-actions"
@mouseenter="e => handleBlockMouseEnter(e,file)"
@mouseleave="handleBlockMouseLeave"
>
<span class="el-upload-list__item-preview" @click="() => preview(file)">
<i class="el-icon-zoom-in"/>
@ -49,193 +49,193 @@
</template>
<script>
/*
* 直传七牛云
* 传入fileList自动拼接七牛云外链前缀并增加downloadUrl属性图片类型的文件url与downloadUrl相同
* 非图片类型的文件使用kkFileView预览
* successremove事件中的file.url均不带七牛云外链前缀
* */
import axios from 'axios'
import {attachmentPrefix} from '@/config'
import {debounce, isEmpty} from '@/utils'
import {elError} from "@/utils/message"
import {isImage, isDoc, isPdf, isPpt, isRar, isXls, isTxt, isZip} from "@/utils/validate"
import {preview, deleteUpload, download, upload, autoCompleteUrl} from "@/utils/file"
const typeMapper = [
{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'},
]
function parseMaxSize(maxSize) {
if (typeof maxSize === 'number') {
return maxSize
/*
* 直传七牛云
* 传入fileList自动拼接七牛云外链前缀并增加downloadUrl属性图片类型的文件url与downloadUrl相同
* 非图片类型的文件使用kkFileView预览
* successremove事件中的file.url均不带七牛云外链前缀
* */
import axios from 'axios'
import {attachmentPrefix} from '@/config'
import {debounce, isEmpty} from '@/utils'
import {elError} from "@/utils/message"
import {isImage, isDoc, isPdf, isPpt, isRar, isXls, isTxt, isZip} from "@/utils/validate"
import {preview, deleteUpload, download, upload, autoCompleteUrl} from "@/utils/file"
const typeMapper = [
{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'},
]
function parseMaxSize(maxSize) {
if (typeof maxSize === 'number') {
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},
upper = maxSize.toUpperCase(),
num = upper.replace(/[^0-9]/ig, ""),
unit = upper.replace(num, "")
computed: {
count() {
return this.data.length
},
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: {
disabled: Boolean,
multiple: {type: Boolean, default: true},
fileList: {type: Array, default: () => []},
limit: {type: Number, default: 10},
maxSize: {type: Number | String, default: '10MB'}
const index = this.data.findIndex(i => i.downloadUrl === file.downloadUrl)
this.$image({index, urlList: this.previewUrlList})
},
data() {
return {
tempData: this.fileList,
data: this.fileList,
tooltipContent: null
}
//
download(file) {
download(file.downloadUrl, file.name)
},
computed: {
count() {
return this.data.length
},
hideUploader() {
return this.disabled || this.count >= this.limit
},
previewUrlList() {
return this.data ? this.data.map(i => i.downloadUrl) : []
}
//
exceed() {
elError(`最多只能上传${this.limit}个文件`)
},
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))
}
}
//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)
},
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()
}
},
//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
//
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
}
},
created() {
this.activateTooltip = debounce(tooltip => tooltip.handleShowPopper(), 200)
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() {
this.activateTooltip = debounce(tooltip => tooltip.handleShowPopper(), 200)
}
}
</script>
<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 AbstractTable from "@/components/AbstractTable"
import CollapseCard from '@/components/CollapseCard'
import DocDetailHeader from "@/bizComponents/document/DocDetailHeader"
import DocDetailFooter from "@/bizComponents/document/DocDetailFooter"
import DocHistory from '@/bizComponents/document/DocHistory'
import DocSteps from '@/bizComponents/document/DocSteps'
import DocDetailHeader from "@/components/biz/doc/DocDetailHeader"
import DocDetailFooter from "@/components/biz/doc/DocDetailFooter"
import DocHistory from '@/components/biz/doc/DocHistory'
import DocSteps from '@/components/biz/doc/DocSteps'
import UploadFile from '@/components/UploadFile'
import {commonMethods} from "@/mixins/bizDocumentTableMixin"
import {commonMethods} from "@/mixins/docTableMixin"
import {isEmpty, mergeObj} from '@/utils'
import {elAlert, elConfirm, elPrompt, elSuccess} from "@/utils/message"
import {deleteUpload} from "@/utils/file"

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

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

@ -56,7 +56,7 @@
import AbstractFormItem from "@/components/AbstractForm/AbstractFormItem"
import FormDialog from '@/components/FormDialog'
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 {add, update, publish, withdraw} from "@/api/message/manage"
import {isEmpty, mergeObj, resetObj} from '@/utils'

@ -69,7 +69,7 @@
import LinerProgress from '@/components/LinerProgress'
import dialogMixin from "@/mixins/dialogMixin"
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"
export default {

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

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

@ -37,7 +37,7 @@
>
<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="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="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>

@ -124,10 +124,10 @@
</template>
<script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin"
import docDetailMixin from "@/mixins/docDetailMixin"
import CategorySelector from './components/CategorySelector'
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 {mul, plus} from "@/utils/math"
import {isInteger} from "@/utils/validate"
@ -135,7 +135,7 @@
export default {
name: "purchaseOrderDetail",
mixins: [bizDocDetailMixin],
mixins: [docDetailMixin],
components: {CategorySelector, SupplierSelector},

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

@ -22,7 +22,7 @@
<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="客 户" 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="linkman" show-overflow-tooltip/>
<el-table-column align="center" label="联系电话" prop="linkphone" show-overflow-tooltip/>

@ -9,7 +9,7 @@
<abstract-form :model="form" :rules="rules">
<collapse-card header="流程进度">
<doc-steps :status="form.status" :type="type"/>
<doc-steps :status="form.status" :finish="form.finish" :type="type"/>
</collapse-card>
<collapse-card header="基础信息">
@ -109,10 +109,10 @@
</template>
<script>
import bizDocDetailMixin from "@/mixins/bizDocDetailMixin"
import docDetailMixin from "@/mixins/docDetailMixin"
import CustomerSelector from './components/CustomerSelector'
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 {mul, plus} from "@/utils/math"
import {isInteger} from "@/utils/validate"
@ -120,7 +120,7 @@
export default {
name: "sellOrderDetail",
mixins: [bizDocDetailMixin],
mixins: [docDetailMixin],
components: {CustomerSelector, StockSelector},

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

@ -42,7 +42,7 @@
size="small"
style="margin-top: 10px"
type="primary"
@click="confirm(row)"
@click="() => confirm(row)"
>
确定
</el-button>
@ -69,7 +69,7 @@
import LinerProgress from '@/components/LinerProgress'
import dialogMixin from "@/mixins/dialogMixin"
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"
export default {

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

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

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

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

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

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

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

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

Loading…
Cancel
Save