Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
J
jilinzhongdianrenqun-web
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Members
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
吴超
jilinzhongdianrenqun-web
Commits
6391ed84
Commit
6391ed84
authored
Dec 25, 2025
by
yubin
Browse files
Options
Browse Files
Download
Plain Diff
请假
parents
de498718
3a9e709f
全部展开
显示空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
538 行增加
和
180 行删除
+538
-180
src/api/key-dm-stats.js
+0
-35
src/api/key-dm-user.js
+10
-3
src/api/key-dm.js
+64
-39
src/view/key-person/key_dm_conf/dates.js
+42
-0
src/view/key-person/key_dm_conf/index.vue
+0
-0
src/view/key-person/key_dm_conf/materialSelector.vue
+10
-11
src/view/key-person/key_dm_inventory/inbound.vue
+108
-24
src/view/key-person/key_dm_inventory/index.vue
+79
-26
src/view/key-person/key_dm_inventory/stats.vue
+70
-31
src/view/key-person/key_dm_leave/index.vue
+14
-11
src/view/key-person/key_dm_user/userMultiSelector.vue
+141
-0
没有找到文件。
src/api/key-dm-stats.js
deleted
100644 → 0
View file @
de498718
import
axios
from
'@/libs/api.request'
// 使用统计
export
const
getUsageStats
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectUsageStats'
,
method
:
'post'
,
data
:
param
})
}
export
const
getUsageDetails
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectUsageDetails'
,
method
:
'post'
,
data
:
param
})
}
// 工作量统计
export
const
getWorkloadStats
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectWorkloadStats'
,
method
:
'post'
,
data
:
param
})
}
export
const
getWorkloadDetails
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectWorkloadDetails'
,
method
:
'post'
,
data
:
param
})
}
src/api/key-dm-user.js
View file @
6391ed84
...
@@ -27,10 +27,10 @@ export const saveDmUser = (param) => {
...
@@ -27,10 +27,10 @@ export const saveDmUser = (param) => {
})
})
}
}
//
分页查询日常人员可选上级领导列表
//
获取人员选择器列表(根据机构和权限过滤)
export
const
dmUserLeader
=
(
param
)
=>
{
export
const
getUserSelectorList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUser/
dmUserLeader
'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUser/
selectUserSelectorList
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
@@ -48,6 +48,13 @@ export const dmUserOffice = (param) => {
...
@@ -48,6 +48,13 @@ export const dmUserOffice = (param) => {
export
const
getUserTypeList
=
(
param
)
=>
{
export
const
getUserTypeList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/selectList'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/selectList'
,
})
}
// 获取人员多选器列表(所有在职人员)
export
const
getUserMultiSelectorList
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUser/selectUserMultiSelectorList'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
...
src/api/key-dm.js
View file @
6391ed84
import
axios
from
'@/libs/api.request'
import
axios
from
'@/libs/api.request'
// ===== 人员
分类管理
=====
// ===== 人员
权限配置
=====
export
const
get
UserCategoryList
=
(
param
)
=>
{
export
const
get
PermissionConfigList
=
(
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/selectList'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/selectPermissionConfigList'
,
method
:
'post'
,
method
:
'post'
data
:
param
})
}
export
const
saveUserCategory
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/save'
,
method
:
'post'
,
data
:
param
})
})
}
}
export
const
deleteUserCategory
=
(
param
)
=>
{
export
const
savePermissionUsers
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/
delete
'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/
savePermissionUsers
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
// =====
人员分类权限
管理 =====
// =====
请假类型
管理 =====
export
const
get
UserCategoryPermission
List
=
(
param
)
=>
{
export
const
get
LeaveType
List
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory
Permission/select
List'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory
/selectLeaveType
List'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
export
const
save
UserCategoryPermission
=
(
param
)
=>
{
export
const
save
LeaveType
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory
Permission/sav
e'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory
/saveLeaveTyp
e'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
// ===== 请假类型管理 =====
export
const
deleteLeaveType
=
(
param
)
=>
{
export
const
getLeaveTypeList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
LeaveType/selectList
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/deleteLeaveType
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
export
const
saveLeaveType
=
(
param
)
=>
{
export
const
findLeaveTypeList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
LeaveType/save
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/findLeaveTypeList
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
export
const
deleteLeaveType
=
(
param
)
=>
{
// ===== 办公用品分类管理 =====
export
const
getMaterialCategoryList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
LeaveType/delete
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/selectMaterialCategoryList
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
// ===== 办公用品分类管理 =====
export
const
saveMaterialCategory
=
(
param
)
=>
{
export
const
getMaterialCategoryList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
MaterialCategory/selectList
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/saveMaterialCategory
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
export
const
sav
eMaterialCategory
=
(
param
)
=>
{
export
const
delet
eMaterialCategory
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
MaterialCategory/save
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/deleteMaterialCategory
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
}
}
export
const
deleteMaterialCategory
=
(
param
)
=>
{
export
const
findMaterialCategoryList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
MaterialCategory/delete
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/findMaterialCategoryList
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
@@ -95,7 +85,7 @@ export const deleteMaterialCategory = (param) => {
...
@@ -95,7 +85,7 @@ export const deleteMaterialCategory = (param) => {
// ===== 办公用品管理 =====
// ===== 办公用品管理 =====
export
const
getMaterialList
=
(
param
)
=>
{
export
const
getMaterialList
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
Material/select
List'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/selectMaterial
List'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
@@ -103,7 +93,7 @@ export const getMaterialList = (param) => {
...
@@ -103,7 +93,7 @@ export const getMaterialList = (param) => {
export
const
saveMaterial
=
(
param
)
=>
{
export
const
saveMaterial
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
Material/save
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/saveMaterial
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
@@ -111,7 +101,7 @@ export const saveMaterial = (param) => {
...
@@ -111,7 +101,7 @@ export const saveMaterial = (param) => {
export
const
deleteMaterial
=
(
param
)
=>
{
export
const
deleteMaterial
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
Material/delete
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/deleteMaterial
'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
@@ -120,7 +110,7 @@ export const deleteMaterial = (param) => {
...
@@ -120,7 +110,7 @@ export const deleteMaterial = (param) => {
// 导入物料(Excel)
// 导入物料(Excel)
export
const
importMaterial
=
(
formData
)
=>
{
export
const
importMaterial
=
(
formData
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDm
Material/import
'
,
url
:
'/api/ac/jilinsscgsdp/keyDm
UserCategory/importMaterial
'
,
method
:
'post'
,
method
:
'post'
,
data
:
formData
data
:
formData
})
})
...
@@ -129,7 +119,42 @@ export const importMaterial = (formData) => {
...
@@ -129,7 +119,42 @@ export const importMaterial = (formData) => {
// 下载物料导入模板
// 下载物料导入模板
export
const
materialTemplateDownload
=
(
param
)
=>
{
export
const
materialTemplateDownload
=
(
param
)
=>
{
return
axios
.
request
({
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmMaterial/templateDownload'
,
url
:
'/api/ac/jilinsscgsdp/keyDmUserCategory/templateDownload'
,
method
:
'post'
,
data
:
param
})
}
// --统计部分---------------------------------------------------------------------------------------------
// 使用统计
export
const
getUsageStats
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectUsageStats'
,
method
:
'post'
,
data
:
param
})
}
export
const
getUsageDetails
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectUsageDetails'
,
method
:
'post'
,
data
:
param
})
}
// 工作量统计
export
const
getWorkloadStats
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectWorkloadStats'
,
method
:
'post'
,
data
:
param
})
}
export
const
getWorkloadDetails
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmStats/selectWorkloadDetails'
,
method
:
'post'
,
method
:
'post'
,
data
:
param
data
:
param
})
})
...
...
src/view/key-person/key_dm_conf/dates.js
0 → 100644
View file @
6391ed84
/* eslint-disable */
export
function
normalizeVisitTimeValue
(
value
)
{
if
(
!
value
&&
value
!==
0
)
return
''
if
(
value
instanceof
Date
)
{
return
Number
.
isNaN
(
value
.
getTime
())
?
''
:
formatDateSegments
(
value
)
}
if
(
typeof
value
===
'number'
&&
!
Number
.
isNaN
(
value
))
{
const
fromNumber
=
new
Date
(
value
)
return
Number
.
isNaN
(
fromNumber
.
getTime
())
?
''
:
formatDateSegments
(
fromNumber
)
}
if
(
typeof
value
===
'string'
)
{
const
trimmed
=
value
.
trim
()
if
(
!
trimmed
)
return
''
const
direct
=
new
Date
(
trimmed
)
if
(
!
Number
.
isNaN
(
direct
.
getTime
()))
return
formatDateSegments
(
direct
)
const
withSlash
=
new
Date
(
trimmed
.
replace
(
/-/g
,
'/'
))
if
(
!
Number
.
isNaN
(
withSlash
.
getTime
()))
return
formatDateSegments
(
withSlash
)
const
match
=
trimmed
.
match
(
/^
(\d{4})
-
(\d{2})
-
(\d{2})(?:[
T
](\d{2})
:
(\d{2})(?:
:
(\d{2}))?)?
$/
)
if
(
match
)
{
const
[,
y
,
m
,
d
,
hh
=
'00'
,
mm
=
'00'
,
ss
=
'00'
]
=
match
return
`
${
y
}
-
${
m
}
-
${
d
}
${
hh
}
:
${
mm
}
:
${
ss
}
`
}
return
''
}
if
(
value
&&
typeof
value
===
'object'
&&
typeof
value
.
valueOf
===
'function'
)
{
const
timestamp
=
value
.
valueOf
()
if
(
!
Number
.
isNaN
(
timestamp
))
{
const
fromValue
=
new
Date
(
timestamp
)
return
Number
.
isNaN
(
fromValue
.
getTime
())
?
''
:
formatDateSegments
(
fromValue
)
}
}
return
''
}
function
formatDateSegments
(
d
)
{
const
y
=
d
.
getFullYear
()
const
mm
=
String
(
d
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)
const
dd
=
String
(
d
.
getDate
()).
padStart
(
2
,
'0'
)
const
HH
=
String
(
d
.
getHours
()).
padStart
(
2
,
'0'
)
const
MM
=
String
(
d
.
getMinutes
()).
padStart
(
2
,
'0'
)
const
SS
=
String
(
d
.
getSeconds
()).
padStart
(
2
,
'0'
)
return
`
${
y
}
-
${
mm
}
-
${
dd
}
${
HH
}
:
${
MM
}
:
${
SS
}
`
}
src/view/key-person/key_dm_conf/index.vue
View file @
6391ed84
差异被折叠。
点击展开。
src/view/key-person/key_dm_conf/materialSelector.vue
View file @
6391ed84
...
@@ -23,14 +23,7 @@
...
@@ -23,14 +23,7 @@
</Row>
</Row>
</div>
</div>
<Table
:data=
"rows"
:loading=
"loading"
@
on-selection-change=
"onSelectionChange"
border
>
<Table
:data=
"rows"
:loading=
"loading"
:columns=
"columns"
@
on-selection-change=
"onSelectionChange"
border
/>
<TableColumn
type=
"selection"
width=
"60"
></TableColumn>
<TableColumn
prop=
"material_code"
title=
"物料编码"
align=
"center"
/>
<TableColumn
prop=
"material_name"
title=
"物料名称"
align=
"center"
/>
<TableColumn
prop=
"unit"
title=
"单位"
align=
"center"
width=
"80"
/>
<TableColumn
prop=
"available_quantity"
title=
"可用库存"
align=
"center"
width=
"120"
/>
<TableColumn
prop=
"category_Name"
title=
"分类"
align=
"center"
/>
</Table>
<Page
class=
"page_style"
:total=
"pager.totalRecord"
:current=
"pager.pageNo"
:page-size=
"pager.pageSize"
show-total
show-sizer
<Page
class=
"page_style"
:total=
"pager.totalRecord"
:current=
"pager.pageNo"
:page-size=
"pager.pageSize"
show-total
show-sizer
@
on-change=
"pageChange"
@
on-page-size-change=
"sizeChange"
/>
@
on-change=
"pageChange"
@
on-page-size-change=
"sizeChange"
/>
...
@@ -62,7 +55,15 @@ export default {
...
@@ -62,7 +55,15 @@ export default {
pager
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
pager
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
selectedRows
:
[],
selectedRows
:
[],
confirming
:
false
,
confirming
:
false
,
categoryOptions
:
[]
categoryOptions
:
[],
columns
:
[
{
type
:
'selection'
,
width
:
60
},
{
title
:
'物料编码'
,
key
:
'material_code'
,
align
:
'center'
},
{
title
:
'物料名称'
,
key
:
'material_name'
,
align
:
'center'
},
{
title
:
'单位'
,
key
:
'unit'
,
align
:
'center'
,
width
:
80
},
{
title
:
'可用库存'
,
key
:
'available_quantity'
,
align
:
'center'
,
width
:
120
},
{
title
:
'分类'
,
key
:
'category_Name'
,
align
:
'center'
}
]
}
}
},
},
computed
:
{
computed
:
{
...
@@ -146,5 +147,3 @@ export default {
...
@@ -146,5 +147,3 @@ export default {
.mr10
{
margin-right
:
10px
;
}
.mr10
{
margin-right
:
10px
;
}
.page_style
{
margin-top
:
12px
;
text-align
:
right
;
}
.page_style
{
margin-top
:
12px
;
text-align
:
right
;
}
</
style
>
</
style
>
src/view/key-person/key_dm_inventory/inbound.vue
View file @
6391ed84
...
@@ -82,14 +82,14 @@
...
@@ -82,14 +82,14 @@
<Input
type=
"textarea"
v-model=
"inboundModal.form.remark"
:rows=
"2"
/>
<Input
type=
"textarea"
v-model=
"inboundModal.form.remark"
:rows=
"2"
/>
</FormItem>
</FormItem>
<h4>
明细(从物料库选择)
</h4>
<h4>
明细(从物料库选择)
<Table
:data=
"inboundModal.details"
size=
"small"
border
>
<div
style=
"float: right;"
>
<TableColumn
prop=
"material_code"
title=
"物料编码"
/
>
<Button
size=
"small"
class=
"mr5"
type=
"primary"
@
click=
"showMaterialSelector = true"
>
添加
</Button
>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/
>
<Button
size=
"small"
type=
"error"
@
click=
"deleteSelectedInboundDetails"
>
删除
</Button
>
<
TableColumn
prop=
"inbound_quantity"
title=
"入库数量"
/
>
<
/div
>
<TableColumn
prop=
"unit_price"
title=
"单价"
/
>
</h4
>
<TableColumn
prop=
"total_amount"
title=
"总金额
"
/>
<Table
:data=
"inboundModal.details"
:columns=
"inboundDetailColumns"
size=
"small"
border
@
on-selection-change=
"onInboundDetailSelectionChange"
style=
"width: 100%
"
/>
<
/Table
>
<
MaterialSelector
v-model=
"showMaterialSelector"
:selected=
"[]"
@
on-ok=
"handleInboundMaterialSelectorOk"
@
cancel=
"showMaterialSelector = false"
/
>
</Form>
</Form>
<div
slot=
"footer"
>
<div
slot=
"footer"
>
<Button
@
click=
"inboundModal.visible=false"
>
取消
</Button>
<Button
@
click=
"inboundModal.visible=false"
>
取消
</Button>
...
@@ -103,11 +103,7 @@
...
@@ -103,11 +103,7 @@
<FormItem
label=
"申请单号"
><span>
{{ returnModal.record.application_no }}
</span></FormItem>
<FormItem
label=
"申请单号"
><span>
{{ returnModal.record.application_no }}
</span></FormItem>
<FormItem
label=
"申请人"
><span>
{{ returnModal.record.applicant_name }}
</span></FormItem>
<FormItem
label=
"申请人"
><span>
{{ returnModal.record.applicant_name }}
</span></FormItem>
<FormItem
label=
"归还明细"
>
<FormItem
label=
"归还明细"
>
<Table
:data=
"returnModal.details"
size=
"small"
border
>
<Table
:data=
"returnModal.details"
:columns=
"returnDetailColumns"
size=
"small"
border
/>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/>
<TableColumn
prop=
"apply_quantity"
title=
"申请数量"
/>
<TableColumn
prop=
"returned_quantity"
title=
"归还数量"
/>
</Table>
</FormItem>
</FormItem>
</Form>
</Form>
<div
slot=
"footer"
>
<div
slot=
"footer"
>
...
@@ -122,18 +118,9 @@
...
@@ -122,18 +118,9 @@
<div
v-else
>
<div
v-else
>
<Row
:gutter=
"16"
><Col
span=
"12"
><p><strong>
单号:
</strong>
{{ detailModal.data.inbound_no || detailModal.data.application_no }}
</p></Col></Row>
<Row
:gutter=
"16"
><Col
span=
"12"
><p><strong>
单号:
</strong>
{{ detailModal.data.inbound_no || detailModal.data.application_no }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
明细
</h4></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
明细
</h4></Col></Row>
<Table
:data=
"detailModal.details"
size=
"small"
border
>
<Table
:data=
"detailModal.details"
:columns=
"detailDetailColumns"
size=
"small"
border
/>
<TableColumn
prop=
"material_code"
title=
"物料编码"
/>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/>
<TableColumn
prop=
"inbound_quantity"
title=
"数量"
/>
<TableColumn
prop=
"unit_price"
title=
"单价"
/>
</Table>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
操作日志
</h4></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
操作日志
</h4></Col></Row>
<Table
:data=
"detailModal.logs"
size=
"small"
border
>
<Table
:data=
"detailModal.logs"
:columns=
"detailLogsColumns"
size=
"small"
border
/>
<TableColumn
prop=
"op_type"
title=
"操作类型"
/>
<TableColumn
prop=
"quantity"
title=
"数量"
/>
<TableColumn
prop=
"create_time"
title=
"时间"
/>
</Table>
</div>
</div>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
</Modal>
</Modal>
...
@@ -151,9 +138,11 @@ import {
...
@@ -151,9 +138,11 @@ import {
getInventoryList
,
getInventoryList
,
getInboundById
getInboundById
}
from
'@/api/key-dm-inbound'
}
from
'@/api/key-dm-inbound'
import
MaterialSelector
from
'@/view/key-person/key_dm_conf/materialSelector.vue'
export
default
{
export
default
{
name
:
'key-dm-inbound-index'
,
name
:
'key-dm-inbound-index'
,
components
:
{
MaterialSelector
},
data
()
{
data
()
{
return
{
return
{
activeTab
:
'inbound'
,
activeTab
:
'inbound'
,
...
@@ -186,6 +175,67 @@ export default {
...
@@ -186,6 +175,67 @@ export default {
{
title
:
'可用'
,
key
:
'available_quantity'
,
align
:
'center'
},
{
title
:
'可用'
,
key
:
'available_quantity'
,
align
:
'center'
},
{
title
:
'借出'
,
key
:
'borrowed_quantity'
,
align
:
'center'
}
{
title
:
'借出'
,
key
:
'borrowed_quantity'
,
align
:
'center'
}
],
],
// 模态窗口内表格列定义
inboundDetailColumns
:
[
{
type
:
'selection'
,
width
:
60
},
{
title
:
'物料编码'
,
key
:
'material_code'
,
minWidth
:
120
},
{
title
:
'物料名称'
,
key
:
'material_name'
,
minWidth
:
150
},
{
title
:
'入库数量'
,
key
:
'inbound_quantity'
,
minWidth
:
120
,
render
:
(
h
,
params
)
=>
{
return
h
(
'InputNumber'
,
{
props
:
{
value
:
params
.
row
.
inbound_quantity
||
0
,
min
:
0
,
precision
:
0
},
style
:
{
width
:
'100px'
},
on
:
{
input
:
(
val
)
=>
{
params
.
row
.
inbound_quantity
=
val
||
0
params
.
row
.
total_amount
=
((
params
.
row
.
inbound_quantity
||
0
)
*
(
params
.
row
.
unit_price
||
0
)).
toFixed
(
2
)
}
}
})
}},
{
title
:
'单价'
,
key
:
'unit_price'
,
minWidth
:
120
,
render
:
(
h
,
params
)
=>
{
return
h
(
'InputNumber'
,
{
props
:
{
value
:
params
.
row
.
unit_price
||
0
,
min
:
0
,
precision
:
2
},
style
:
{
width
:
'100px'
},
on
:
{
input
:
(
val
)
=>
{
params
.
row
.
unit_price
=
val
||
0
params
.
row
.
total_amount
=
((
params
.
row
.
inbound_quantity
||
0
)
*
(
params
.
row
.
unit_price
||
0
)).
toFixed
(
2
)
}
}
})
}},
{
title
:
'总金额'
,
key
:
'total_amount'
,
minWidth
:
120
,
render
:
(
h
,
params
)
=>
{
const
amount
=
((
params
.
row
.
inbound_quantity
||
0
)
*
(
params
.
row
.
unit_price
||
0
)).
toFixed
(
2
)
return
h
(
'span'
,
amount
)
}}
],
returnDetailColumns
:
[
{
title
:
'物料名称'
,
key
:
'material_name'
},
{
title
:
'申请数量'
,
key
:
'apply_quantity'
},
{
title
:
'归还数量'
,
key
:
'returned_quantity'
}
],
detailDetailColumns
:
[
{
title
:
'物料编码'
,
key
:
'material_code'
},
{
title
:
'物料名称'
,
key
:
'material_name'
},
{
title
:
'数量'
,
key
:
'inbound_quantity'
},
{
title
:
'单价'
,
key
:
'unit_price'
}
],
detailLogsColumns
:
[
{
title
:
'操作类型'
,
key
:
'op_type'
},
{
title
:
'数量'
,
key
:
'quantity'
},
{
title
:
'时间'
,
key
:
'create_time'
}
],
// 选择器控制与已选明细
showMaterialSelector
:
false
,
inboundSelectedDetails
:
[],
inboundModal
:
{
visible
:
false
,
isEdit
:
false
,
saving
:
false
,
form
:
{},
details
:
[]
},
inboundModal
:
{
visible
:
false
,
isEdit
:
false
,
saving
:
false
,
form
:
{},
details
:
[]
},
returnModal
:
{
visible
:
false
,
record
:
{},
details
:
[],
saving
:
false
},
returnModal
:
{
visible
:
false
,
record
:
{},
details
:
[],
saving
:
false
},
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
details
:
[],
logs
:
[]
}
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
details
:
[],
logs
:
[]
}
...
@@ -222,6 +272,40 @@ export default {
...
@@ -222,6 +272,40 @@ export default {
this
.
inboundModal
.
details
=
[]
this
.
inboundModal
.
details
=
[]
this
.
inboundModal
.
visible
=
true
this
.
inboundModal
.
visible
=
true
},
},
onInboundDetailSelectionChange
(
list
)
{
this
.
inboundSelectedDetails
=
list
||
[]
},
handleInboundMaterialSelectorOk
(
selectedRows
)
{
if
(
!
Array
.
isArray
(
selectedRows
)
||
selectedRows
.
length
===
0
)
{
this
.
$Message
.
warning
(
'未选择物料'
)
return
}
selectedRows
.
forEach
(
sel
=>
{
const
code
=
sel
.
material_code
const
exist
=
this
.
inboundModal
.
details
.
find
(
d
=>
d
.
material_code
===
code
)
if
(
exist
)
{
exist
.
inbound_quantity
=
Number
(
exist
.
inbound_quantity
||
0
)
+
1
}
else
{
this
.
inboundModal
.
details
.
push
({
material_code
:
sel
.
material_code
,
material_name
:
sel
.
material_name
,
inbound_quantity
:
0
,
unit_price
:
0
,
total_amount
:
0
})
}
})
this
.
showMaterialSelector
=
false
},
deleteSelectedInboundDetails
()
{
if
(
!
this
.
inboundSelectedDetails
||
this
.
inboundSelectedDetails
.
length
===
0
)
{
this
.
$Message
.
warning
(
'请先选择要删除的明细行'
)
return
}
const
toRemoveCodes
=
this
.
inboundSelectedDetails
.
map
(
r
=>
r
.
material_code
)
this
.
inboundModal
.
details
=
this
.
inboundModal
.
details
.
filter
(
d
=>
!
toRemoveCodes
.
includes
(
d
.
material_code
))
this
.
inboundSelectedDetails
=
[]
},
openEdit
(
row
)
{
openEdit
(
row
)
{
this
.
inboundModal
.
isEdit
=
true
this
.
inboundModal
.
isEdit
=
true
getInboundById
({
id
:
row
.
id
}).
then
(
ret
=>
{
getInboundById
({
id
:
row
.
id
}).
then
(
ret
=>
{
...
...
src/view/key-person/key_dm_inventory/index.vue
View file @
6391ed84
...
@@ -67,13 +67,14 @@
...
@@ -67,13 +67,14 @@
</FormItem>
</FormItem>
<h4>
申请明细
</h4>
<h4>
申请明细
</h4>
<Table
:data=
"applyModal.details"
size=
"small"
border
>
<Row
type=
"flex"
justify=
"end"
class=
"mb8"
>
<TableColumn
prop=
"material_code"
title=
"物料编码"
/>
<Col>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/>
<Button
size=
"small"
class=
"mr5"
type=
"primary"
@
click=
"showMaterialSelector = true"
>
添加
</Button>
<TableColumn
prop=
"apply_quantity"
title=
"申请数量"
/>
<Button
size=
"small"
type=
"error"
@
click=
"deleteSelectedDetails"
>
删除
</Button>
<TableColumn
prop=
"unit"
title=
"单位"
/>
</Col>
<TableColumn
prop=
"issue_remark"
title=
"备注"
/>
</Row>
</Table>
<Table
:data=
"applyModal.details"
:columns=
"applyDetailColumns"
size=
"small"
border
@
on-selection-change=
"onApplyDetailSelectionChange"
/>
<MaterialSelector
v-model=
"showMaterialSelector"
:selected=
"[]"
@
on-ok=
"handleMaterialSelectorOk"
@
cancel=
"showMaterialSelector = false"
/>
</Form>
</Form>
<div
slot=
"footer"
>
<div
slot=
"footer"
>
<Button
@
click=
"applyModal.visible=false"
>
取消
</Button>
<Button
@
click=
"applyModal.visible=false"
>
取消
</Button>
...
@@ -87,12 +88,7 @@
...
@@ -87,12 +88,7 @@
<FormItem
label=
"申请单号"
><span>
{{ approveModal.record.application_no }}
</span></FormItem>
<FormItem
label=
"申请单号"
><span>
{{ approveModal.record.application_no }}
</span></FormItem>
<FormItem
label=
"申请人"
><span>
{{ approveModal.record.applicant_name }}
</span></FormItem>
<FormItem
label=
"申请人"
><span>
{{ approveModal.record.applicant_name }}
</span></FormItem>
<FormItem
label=
"申请明细"
>
<FormItem
label=
"申请明细"
>
<Table
:data=
"approveModal.details"
size=
"small"
border
>
<Table
:data=
"approveModal.details"
:columns=
"approveDetailColumns"
size=
"small"
border
/>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/>
<TableColumn
prop=
"apply_quantity"
title=
"申请数量"
/>
<TableColumn
prop=
"unit"
title=
"单位"
/>
<TableColumn
prop=
"available_quantity"
title=
"可用库存"
/>
</Table>
</FormItem>
</FormItem>
<FormItem
label=
"审批意见"
>
<FormItem
label=
"审批意见"
>
<Input
type=
"textarea"
v-model=
"approveModal.opinion"
placeholder=
"驳回时必填"
/>
<Input
type=
"textarea"
v-model=
"approveModal.opinion"
placeholder=
"驳回时必填"
/>
...
@@ -112,20 +108,9 @@
...
@@ -112,20 +108,9 @@
<Row
:gutter=
"16"
><Col
span=
"12"
><p><strong>
申请人:
</strong>
{{ detailModal.data.applicant_name }}
</p></Col><Col
span=
"12"
><p><strong>
部门:
</strong>
{{ detailModal.data.department_name }}
</p></Col></Row>
<Row
:gutter=
"16"
><Col
span=
"12"
><p><strong>
申请人:
</strong>
{{ detailModal.data.applicant_name }}
</p></Col><Col
span=
"12"
><p><strong>
部门:
</strong>
{{ detailModal.data.department_name }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
领用用途:
</strong>
{{ detailModal.data.borrow_purpose }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
领用用途:
</strong>
{{ detailModal.data.borrow_purpose }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
明细
</h4></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
明细
</h4></Col></Row>
<Table
:data=
"detailModal.details"
size=
"small"
border
>
<Table
:data=
"detailModal.details"
:columns=
"detailDetailColumns"
size=
"small"
border
/>
<TableColumn
prop=
"material_code"
title=
"物料编码"
/>
<TableColumn
prop=
"material_name"
title=
"物料名称"
/>
<TableColumn
prop=
"apply_quantity"
title=
"申请数量"
/>
<TableColumn
prop=
"unit"
title=
"单位"
/>
<TableColumn
prop=
"returned_quantity"
title=
"已归还"
/>
</Table>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
审批记录
</h4></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><h4>
审批记录
</h4></Col></Row>
<Table
:data=
"detailModal.logs"
size=
"small"
border
>
<Table
:data=
"detailModal.logs"
:columns=
"detailLogsColumns"
size=
"small"
border
/>
<TableColumn
prop=
"op_type"
title=
"操作类型"
/>
<TableColumn
prop=
"quantity"
title=
"数量"
/>
<TableColumn
prop=
"create_time"
title=
"时间"
/>
<TableColumn
prop=
"create_by"
title=
"操作人"
/>
</Table>
</div>
</div>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
</Modal>
</Modal>
...
@@ -143,9 +128,11 @@ import {
...
@@ -143,9 +128,11 @@ import {
rejectBorrow
,
rejectBorrow
,
getBorrowById
getBorrowById
}
from
'@/api/key-dm-inventory'
}
from
'@/api/key-dm-inventory'
import
MaterialSelector
from
'@/view/key-person/key_dm_conf/materialSelector.vue'
export
default
{
export
default
{
name
:
'key-dm-inventory-index'
,
name
:
'key-dm-inventory-index'
,
components
:
{
MaterialSelector
},
data
()
{
data
()
{
return
{
return
{
activeTab
:
'apply'
,
activeTab
:
'apply'
,
...
@@ -180,6 +167,37 @@ export default {
...
@@ -180,6 +167,37 @@ export default {
{
title
:
'审批完成时间'
,
key
:
'approval_complete_time'
,
align
:
'center'
},
{
title
:
'审批完成时间'
,
key
:
'approval_complete_time'
,
align
:
'center'
},
{
title
:
'操作'
,
slot
:
'action'
,
width
:
100
,
align
:
'center'
}
{
title
:
'操作'
,
slot
:
'action'
,
width
:
100
,
align
:
'center'
}
],
],
// 模态窗口内表格列定义
applyDetailColumns
:
[
{
type
:
'selection'
,
width
:
60
},
{
title
:
'物料编码'
,
key
:
'material_code'
},
{
title
:
'物料名称'
,
key
:
'material_name'
},
{
title
:
'申请数量'
,
key
:
'apply_quantity'
},
{
title
:
'单位'
,
key
:
'unit'
},
{
title
:
'备注'
,
key
:
'issue_remark'
}
],
approveDetailColumns
:
[
{
title
:
'物料名称'
,
key
:
'material_name'
},
{
title
:
'申请数量'
,
key
:
'apply_quantity'
},
{
title
:
'单位'
,
key
:
'unit'
},
{
title
:
'可用库存'
,
key
:
'available_quantity'
}
],
detailDetailColumns
:
[
{
title
:
'物料编码'
,
key
:
'material_code'
},
{
title
:
'物料名称'
,
key
:
'material_name'
},
{
title
:
'申请数量'
,
key
:
'apply_quantity'
},
{
title
:
'单位'
,
key
:
'unit'
},
{
title
:
'已归还'
,
key
:
'returned_quantity'
}
],
detailLogsColumns
:
[
{
title
:
'操作类型'
,
key
:
'op_type'
},
{
title
:
'数量'
,
key
:
'quantity'
},
{
title
:
'时间'
,
key
:
'create_time'
},
{
title
:
'操作人'
,
key
:
'create_by'
}
],
// 选择器控制与已选明细
showMaterialSelector
:
false
,
applySelectedDetails
:
[],
applyModal
:
{
visible
:
false
,
isEdit
:
false
,
saving
:
false
,
form
:
{},
details
:
[]
},
applyModal
:
{
visible
:
false
,
isEdit
:
false
,
saving
:
false
,
form
:
{},
details
:
[]
},
approveModal
:
{
visible
:
false
,
record
:
{},
details
:
[],
opinion
:
''
,
submitting
:
false
},
approveModal
:
{
visible
:
false
,
record
:
{},
details
:
[],
opinion
:
''
,
submitting
:
false
},
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
details
:
[],
logs
:
[]
}
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
details
:
[],
logs
:
[]
}
...
@@ -227,6 +245,41 @@ export default {
...
@@ -227,6 +245,41 @@ export default {
})
})
this
.
applyModal
.
visible
=
true
this
.
applyModal
.
visible
=
true
},
},
onApplyDetailSelectionChange
(
list
)
{
this
.
applySelectedDetails
=
list
||
[]
},
handleMaterialSelectorOk
(
selectedRows
)
{
if
(
!
Array
.
isArray
(
selectedRows
)
||
selectedRows
.
length
===
0
)
{
this
.
$Message
.
warning
(
'未选择物料'
)
return
}
selectedRows
.
forEach
(
sel
=>
{
const
code
=
sel
.
material_code
const
exist
=
this
.
applyModal
.
details
.
find
(
d
=>
d
.
material_code
===
code
)
if
(
exist
)
{
exist
.
apply_quantity
=
Number
(
exist
.
apply_quantity
||
0
)
+
1
}
else
{
this
.
applyModal
.
details
.
push
({
material_code
:
sel
.
material_code
,
material_name
:
sel
.
material_name
,
apply_quantity
:
1
,
unit
:
sel
.
unit
,
issue_remark
:
''
,
available_quantity
:
sel
.
available_quantity
||
0
})
}
})
this
.
showMaterialSelector
=
false
},
deleteSelectedDetails
()
{
if
(
!
this
.
applySelectedDetails
||
this
.
applySelectedDetails
.
length
===
0
)
{
this
.
$Message
.
warning
(
'请先选择要删除的明细行'
)
return
}
const
toRemoveCodes
=
this
.
applySelectedDetails
.
map
(
r
=>
r
.
material_code
)
this
.
applyModal
.
details
=
this
.
applyModal
.
details
.
filter
(
d
=>
!
toRemoveCodes
.
includes
(
d
.
material_code
))
this
.
applySelectedDetails
=
[]
},
saveApplication
()
{
saveApplication
()
{
this
.
applyModal
.
saving
=
true
this
.
applyModal
.
saving
=
true
const
payload
=
Object
.
assign
({},
this
.
applyModal
.
form
,
{
details
:
this
.
applyModal
.
details
})
const
payload
=
Object
.
assign
({},
this
.
applyModal
.
form
,
{
details
:
this
.
applyModal
.
details
})
...
...
src/view/key-person/key_dm_inventory/stats.vue
View file @
6391ed84
<
template
>
<
template
>
<div
class=
"key-dm-stats-wrapper"
>
<div
class=
"key-dm-stats-wrapper"
>
<Tabs
v-model=
"activeTab"
@
on-click=
"handleTabChange"
>
<Tabs
v-model=
"activeTab"
@
on-click=
"handleTabChange"
class=
"tabsCls"
>
<TabPane
label=
"办公用品使用统计"
name=
"usage"
>
<TabPane
label=
"办公用品使用统计"
name=
"usage"
>
<div
class=
"search-div"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
:span=
"
8
"
>
<Col
:span=
"
20
"
>
<span>
时间段
:
</span>
<span>
开始
:
</span>
<DatePicker
v-model=
"usage
Range"
type=
"daterange"
style=
"width:70%
"
/>
<DatePicker
v-model=
"usage
Start"
type=
"date"
style=
"min-width:110px;margin-right:20px
"
/>
</Col
>
<span>
结束:
</span
>
<Col
:span=
"8"
>
<DatePicker
v-model=
"usageEnd"
type=
"date"
style=
"min-width:110px;margin-right:20px"
/
>
<span>
物料:
</span>
<span>
物料:
</span>
<Input
v-model=
"usageMaterial"
placeholder=
"物料名称或编码"
style=
"width:
70%
"
/>
<Input
v-model=
"usageMaterial"
placeholder=
"物料名称或编码"
style=
"width:
150px
"
/>
</Col>
</Col>
<Col
:span=
"
8
"
class=
"text-right"
>
<Col
:span=
"
4
"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"loadUsage"
>
统计
</Button>
<Button
type=
"primary"
class=
"mr10"
@
click=
"loadUsage"
>
统计
</Button>
<Button
@
click=
"resetUsage"
>
重置
</Button>
<Button
@
click=
"resetUsage"
>
重置
</Button>
</Col>
</Col>
...
@@ -28,9 +28,11 @@
...
@@ -28,9 +28,11 @@
<TabPane
label=
"工作量统计"
name=
"workload"
>
<TabPane
label=
"工作量统计"
name=
"workload"
>
<div
class=
"search-div"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
:span=
"10"
>
<Col
:span=
"18"
>
<span>
时间段:
</span>
<span>
开始:
</span>
<DatePicker
v-model=
"workRange"
type=
"daterange"
style=
"width:70%"
/>
<DatePicker
v-model=
"workStart"
type=
"date"
style=
"min-width:110px;margin-right:20px"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"workEnd"
type=
"date"
style=
"min-width:110px;margin-right:20px"
/>
</Col>
</Col>
<Col
:span=
"6"
class=
"text-right"
>
<Col
:span=
"6"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"loadWorkload"
>
统计
</Button>
<Button
type=
"primary"
class=
"mr10"
@
click=
"loadWorkload"
>
统计
</Button>
...
@@ -49,25 +51,26 @@
...
@@ -49,25 +51,26 @@
<!-- 使用明细弹窗 -->
<!-- 使用明细弹窗 -->
<Modal
v-model=
"detailModal.visible"
title=
"明细"
width=
"800"
>
<Modal
v-model=
"detailModal.visible"
title=
"明细"
width=
"800"
>
<Table
:data=
"detailModal.rows"
size=
"small"
border
>
<Table
:data=
"detailModal.rows"
:columns=
"detailModal.columns"
size=
"small"
border
/>
<TableColumn
v-for=
"col in detailModal.columns"
:key=
"col.key"
:prop=
"col.key"
:title=
"col.title"
/>
</Table>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
<div
slot=
"footer"
><Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button></div>
</Modal>
</Modal>
</div>
</div>
</template>
</template>
<
script
>
<
script
>
import
{
getUsageStats
,
getUsageDetails
,
getWorkloadStats
,
getWorkloadDetails
}
from
'@/api/key-dm-stats'
import
{
getUsageStats
,
getUsageDetails
,
getWorkloadStats
,
getWorkloadDetails
}
from
'@/api/key-dm'
import
{
normalizeVisitTimeValue
}
from
'@/view/key-person/key_dm_conf/dates.js'
export
default
{
export
default
{
name
:
'key-dm-stats-index'
,
name
:
'key-dm-stats-index'
,
data
()
{
data
()
{
return
{
return
{
activeTab
:
'usage'
,
activeTab
:
'usage'
,
usageRange
:
[],
usageStart
:
new
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
),
usageEnd
:
new
Date
(),
usageMaterial
:
''
,
usageMaterial
:
''
,
workRange
:
[],
workStart
:
new
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
),
workEnd
:
new
Date
(),
tables
:
{
usage
:
[],
workload
:
[]
},
tables
:
{
usage
:
[],
workload
:
[]
},
loading
:
{
usage
:
false
,
workload
:
false
},
loading
:
{
usage
:
false
,
workload
:
false
},
usageColumns
:
[
usageColumns
:
[
...
@@ -87,48 +90,83 @@ export default {
...
@@ -87,48 +90,83 @@ export default {
{
title
:
'请假时长(天)'
,
key
:
'leave_duration'
,
align
:
'center'
},
{
title
:
'请假时长(天)'
,
key
:
'leave_duration'
,
align
:
'center'
},
{
title
:
'操作'
,
slot
:
'action'
,
width
:
160
,
align
:
'center'
}
{
title
:
'操作'
,
slot
:
'action'
,
width
:
160
,
align
:
'center'
}
],
],
detailModal
:
{
visible
:
false
,
rows
:
[],
columns
:
[]
}
detailModal
:
{
visible
:
false
,
rows
:
[],
columns
:
[]
}
}
}
},
},
created
()
{
this
.
loadUsage
()
},
methods
:
{
methods
:
{
handleTabChange
(
name
)
{
handleTabChange
(
name
)
{
this
.
activeTab
=
name
this
.
activeTab
=
name
if
(
name
===
'usage'
)
{
this
.
loadUsage
()
}
else
{
this
.
loadWorkload
()
}
},
},
loadUsage
()
{
loadUsage
()
{
this
.
loading
.
usage
=
true
this
.
loading
.
usage
=
true
const
params
=
{
start
:
this
.
usageRange
[
0
],
end
:
this
.
usageRange
[
1
],
material
:
this
.
usageMaterial
}
const
st
=
this
.
usageStart
?
normalizeVisitTimeValue
(
this
.
usageStart
)
:
null
getUsageStats
({
params
}).
then
(
ret
=>
{
const
et
=
this
.
usageEnd
?
normalizeVisitTimeValue
(
this
.
usageEnd
)
:
null
const
params
=
{
start
:
st
,
end
:
et
,
material
:
this
.
usageMaterial
}
getUsageStats
(
params
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
tables
.
usage
=
ret
.
data
.
data
||
[]
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
tables
.
usage
=
ret
.
data
.
data
||
[]
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
}).
finally
(()
=>
{
this
.
loading
.
usage
=
false
})
}).
finally
(()
=>
{
this
.
loading
.
usage
=
false
})
},
},
resetUsage
()
{
this
.
usage
Range
=
[]
;
this
.
usageMaterial
=
''
;
this
.
tables
.
usage
=
[]
},
resetUsage
()
{
this
.
usage
Start
=
null
;
this
.
usageEnd
=
null
;
this
.
usageMaterial
=
''
;
this
.
tables
.
usage
=
[]
},
openUsageDetail
(
row
)
{
openUsageDetail
(
row
)
{
this
.
detailModal
.
columns
=
[{
key
:
'user_name'
,
title
:
'人员'
},
{
key
:
'quantity'
,
title
:
'数量'
},
{
key
:
'material_name'
,
title
:
'物料'
},
{
key
:
'department_name'
,
title
:
'部门'
}]
this
.
detailModal
.
columns
=
[
{
title
:
'部门'
,
key
:
'department_name'
,
align
:
'center'
},
{
title
:
'人员'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'物料'
,
key
:
'material_name'
,
align
:
'center'
},
{
title
:
'申请数量'
,
key
:
'apply_quantity'
,
align
:
'center'
},
{
title
:
'已归还数量'
,
key
:
'returned_quantity'
,
align
:
'center'
}
]
this
.
detailModal
.
visible
=
true
this
.
detailModal
.
visible
=
true
getUsageDetails
({
params
:
{
start
:
this
.
usageRange
[
0
],
end
:
this
.
usageRange
[
1
],
material
:
this
.
usageMaterial
,
department
:
row
.
department_id
}
}).
then
(
ret
=>
{
const
st
=
this
.
usageStart
?
normalizeVisitTimeValue
(
this
.
usageStart
)
:
null
const
et
=
this
.
usageEnd
?
normalizeVisitTimeValue
(
this
.
usageEnd
)
:
null
getUsageDetails
({
start
:
st
,
end
:
et
,
material
:
row
.
material_id
,
department
:
row
.
department_id
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[]
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[]
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
})
})
},
},
loadWorkload
()
{
loadWorkload
()
{
this
.
loading
.
workload
=
true
this
.
loading
.
workload
=
true
const
params
=
{
start
:
this
.
workRange
[
0
],
end
:
this
.
workRange
[
1
]
}
const
st
=
this
.
workStart
?
normalizeVisitTimeValue
(
this
.
workStart
)
:
null
getWorkloadStats
({
params
}).
then
(
ret
=>
{
const
et
=
this
.
workEnd
?
normalizeVisitTimeValue
(
this
.
workEnd
)
:
null
const
params
=
{
start
:
st
,
end
:
et
}
getWorkloadStats
(
params
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
tables
.
workload
=
ret
.
data
.
data
||
[]
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
this
.
tables
.
workload
=
ret
.
data
.
data
||
[]
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
}).
finally
(()
=>
{
this
.
loading
.
workload
=
false
})
}).
finally
(()
=>
{
this
.
loading
.
workload
=
false
})
},
},
resetWorkload
()
{
this
.
work
Range
=
[]
;
this
.
tables
.
workload
=
[]
},
resetWorkload
()
{
this
.
work
Start
=
null
;
this
.
workEnd
=
null
;
this
.
tables
.
workload
=
[]
},
openWorkloadDetail
(
row
,
type
)
{
openWorkloadDetail
(
row
,
type
)
{
const
st
=
this
.
workStart
?
normalizeVisitTimeValue
(
this
.
workStart
)
:
null
const
et
=
this
.
workEnd
?
normalizeVisitTimeValue
(
this
.
workEnd
)
:
null
if
(
type
===
'leave'
)
{
if
(
type
===
'leave'
)
{
this
.
detailModal
.
columns
=
[{
key
:
'user_name'
,
title
:
'人员'
},
{
key
:
'start_time'
,
title
:
'开始'
},
{
key
:
'end_time'
,
title
:
'结束'
},
{
key
:
'duration'
,
title
:
'时长'
}]
this
.
detailModal
.
columns
=
[
getWorkloadDetails
({
params
:
{
user_id
:
row
.
user_id
,
start
:
this
.
workRange
[
0
],
end
:
this
.
workRange
[
1
],
type
:
'leave'
}
}).
then
(
ret
=>
{
{
title
:
'人员'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'开始'
,
key
:
'start_time'
,
align
:
'center'
},
{
title
:
'结束'
,
key
:
'end_time'
,
align
:
'center'
},
{
title
:
'时长'
,
key
:
'duration'
,
align
:
'center'
}
]
getWorkloadDetails
({
user_id
:
row
.
user_id
,
start
:
st
,
end
:
et
,
type
:
'leave'
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[];
this
.
detailModal
.
visible
=
true
}
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[];
this
.
detailModal
.
visible
=
true
}
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
})
})
}
else
{
}
else
{
this
.
detailModal
.
columns
=
[{
key
:
'application_no'
,
title
:
'申请单号'
},
{
key
:
'material_name'
,
title
:
'物料'
},
{
key
:
'apply_quantity'
,
title
:
'数量'
}]
this
.
detailModal
.
columns
=
[
getWorkloadDetails
({
params
:
{
user_id
:
row
.
user_id
,
start
:
this
.
workRange
[
0
],
end
:
this
.
workRange
[
1
],
type
:
'inventory'
}
}).
then
(
ret
=>
{
{
title
:
'申请单号'
,
key
:
'application_no'
,
align
:
'center'
},
{
title
:
'物料'
,
key
:
'material_name'
,
align
:
'center'
},
{
title
:
'数量'
,
key
:
'apply_quantity'
,
align
:
'center'
}
]
getWorkloadDetails
({
user_id
:
row
.
user_id
,
start
:
st
,
end
:
et
,
type
:
'inventory'
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[];
this
.
detailModal
.
visible
=
true
}
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
detailModal
.
rows
=
ret
.
data
.
data
||
[];
this
.
detailModal
.
visible
=
true
}
else
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
})
})
}
}
...
@@ -138,7 +176,8 @@ export default {
...
@@ -138,7 +176,8 @@ export default {
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
.key-dm-stats-wrapper
{
padding
:
10px
;
}
.key-dm-stats-wrapper
{
padding
:
10px
;
min-height
:
380px
;}
.tabsCls
{
min-height
:
380px
;}
.search-div
{
border
:
1px
solid
#dce1e7
;
padding
:
12px
;
margin-bottom
:
12px
;
background-color
:
#f8fbff
;
}
.search-div
{
border
:
1px
solid
#dce1e7
;
padding
:
12px
;
margin-bottom
:
12px
;
background-color
:
#f8fbff
;
}
.mr10
{
margin-right
:
10px
;
}
.mr10
{
margin-right
:
10px
;
}
.text-right
{
text-align
:
right
;
}
.text-right
{
text-align
:
right
;
}
...
...
src/view/key-person/key_dm_leave/index.vue
View file @
6391ed84
<
template
>
<
template
>
<div
class=
"key-dm-leave-wrapper"
>
<div
class=
"key-dm-leave-wrapper"
>
<Tabs
v-model=
"activeTab"
@
on-click=
"handleTabChange"
>
<Tabs
v-model=
"activeTab"
@
on-click=
"handleTabChange"
class=
"tabsCls"
>
<TabPane
label=
"请假申请"
name=
"apply"
>
<TabPane
label=
"请假申请"
name=
"apply"
>
<div
class=
"search-div"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
>
<Row
type=
"flex"
:gutter=
"16"
>
...
@@ -71,11 +71,11 @@
...
@@ -71,11 +71,11 @@
<TabPane
label=
"请假统计"
name=
"stats"
>
<TabPane
label=
"请假统计"
name=
"stats"
>
<div
class=
"search-div"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"
8
"
>
<Col
span=
"
16
"
>
<span>
时间段
:
</span>
<span>
开始
:
</span>
<DatePicker
v-model=
"stats
Range"
type=
"daterange"
placeholder=
"选择时间段"
style=
"width:70%
"
/>
<DatePicker
v-model=
"stats
Start"
type=
"date"
placeholder=
"开始日期"
style=
"min-width:110px;margin-right:20px
"
/>
</Col
>
<span>
结束:
</span
>
<Col
span=
"8"
>
<DatePicker
v-model=
"statsEnd"
type=
"date"
placeholder=
"结束日期"
style=
"min-width:110px;margin-right:20px"
/
>
<span>
部门:
</span>
<span>
部门:
</span>
<Input
v-model=
"statsDept"
placeholder=
"请输入部门名称"
style=
"width:65%"
/>
<Input
v-model=
"statsDept"
placeholder=
"请输入部门名称"
style=
"width:65%"
/>
</Col>
</Col>
...
@@ -271,7 +271,8 @@ export default {
...
@@ -271,7 +271,8 @@ export default {
approveModal
:
{
visible
:
false
,
record
:
{},
comment
:
''
,
submitting
:
false
},
approveModal
:
{
visible
:
false
,
record
:
{},
comment
:
''
,
submitting
:
false
},
transferModal
:
{
visible
:
false
,
selectedApprover
:
''
,
comment
:
''
,
processing
:
false
,
record
:
{}
},
transferModal
:
{
visible
:
false
,
selectedApprover
:
''
,
comment
:
''
,
processing
:
false
,
record
:
{}
},
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
approvals
:
[]
},
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
approvals
:
[]
},
statsRange
:
[],
statsStart
:
new
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
),
statsEnd
:
new
Date
(),
statsDept
:
''
statsDept
:
''
}
}
},
},
...
@@ -574,8 +575,8 @@ export default {
...
@@ -574,8 +575,8 @@ export default {
loadStats
()
{
loadStats
()
{
this
.
loading
.
stats
=
true
this
.
loading
.
stats
=
true
const
params
=
{
const
params
=
{
start
:
this
.
stats
Range
&&
this
.
statsRange
[
0
]
,
start
:
this
.
stats
Start
,
end
:
this
.
stats
Range
&&
this
.
statsRange
[
1
]
,
end
:
this
.
stats
End
,
department
:
this
.
statsDept
department
:
this
.
statsDept
}
}
getLeaveStats
({
params
}).
then
(
ret
=>
{
getLeaveStats
({
params
}).
then
(
ret
=>
{
...
@@ -588,7 +589,8 @@ export default {
...
@@ -588,7 +589,8 @@ export default {
}).
finally
(()
=>
{
this
.
loading
.
stats
=
false
})
}).
finally
(()
=>
{
this
.
loading
.
stats
=
false
})
},
},
resetStats
()
{
resetStats
()
{
this
.
statsRange
=
[]
this
.
statsStart
=
null
this
.
statsEnd
=
null
this
.
statsDept
=
''
this
.
statsDept
=
''
this
.
tables
.
stats
=
[]
this
.
tables
.
stats
=
[]
}
}
...
@@ -597,7 +599,8 @@ export default {
...
@@ -597,7 +599,8 @@ export default {
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
.key-dm-leave-wrapper
{
padding
:
10px
;
}
.key-dm-leave-wrapper
{
padding
:
10px
;
min-height
:
380px
;}
.tabsCls
{
min-height
:
380px
;}
.search-div
{
border
:
1px
solid
#dce1e7
;
padding
:
12px
;
margin-bottom
:
12px
;
background-color
:
#f8fbff
;
}
.search-div
{
border
:
1px
solid
#dce1e7
;
padding
:
12px
;
margin-bottom
:
12px
;
background-color
:
#f8fbff
;
}
.mr10
{
margin-right
:
10px
;
}
.mr10
{
margin-right
:
10px
;
}
.text-right
{
text-align
:
right
;
}
.text-right
{
text-align
:
right
;
}
...
...
src/view/key-person/key_dm_user/userMultiSelector.vue
0 → 100644
View file @
6391ed84
<
template
>
<Modal
v-model=
"visible"
title=
"选择人员"
width=
"900"
:mask-closable=
"false"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
:span=
"12"
>
<span>
姓名:
</span>
<Input
v-model=
"filters.name"
placeholder=
"请输入姓名"
@
on-enter=
"handleSearch"
/>
</Col>
<Col
:span=
"12"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch"
>
搜索
</Button>
<Button
@
click=
"handleReset"
>
重置
</Button>
</Col>
</Row>
</div>
<Table
:data=
"rows"
:loading=
"loading"
:columns=
"columns"
@
on-selection-change=
"onSelectionChange"
border
/>
<Page
class=
"page_style"
:total=
"pager.totalRecord"
:current=
"pager.pageNo"
:page-size=
"pager.pageSize"
show-total
show-sizer
@
on-change=
"pageChange"
@
on-page-size-change=
"sizeChange"
/>
<div
slot=
"footer"
>
<Button
@
click=
"handleCancel"
>
取消
</Button>
<Button
type=
"primary"
:loading=
"confirming"
@
click=
"handleConfirm"
>
确定(
{{
selectedRows
.
length
}}
)
</Button>
</div>
</Modal>
</
template
>
<
script
>
import
{
getUserMultiSelectorList
}
from
'@/api/key-dm-user'
export
default
{
name
:
'user-multi-selector'
,
props
:
{
// v-model: value 控制显示
value
:
{
type
:
Boolean
,
default
:
false
}
},
data
()
{
return
{
visibleInternal
:
false
,
filters
:
{
name
:
''
},
rows
:
[],
loading
:
false
,
pager
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
selectedRows
:
[],
confirming
:
false
,
columns
:
[
{
type
:
'selection'
,
width
:
60
,
align
:
'center'
},
{
title
:
'姓名'
,
key
:
'name'
,
align
:
'center'
,
minWidth
:
100
},
{
title
:
'工号'
,
key
:
'gh'
,
align
:
'center'
,
minWidth
:
120
},
{
title
:
'邮箱'
,
key
:
'email'
,
align
:
'center'
,
minWidth
:
150
},
{
title
:
'电话'
,
key
:
'phone'
,
align
:
'center'
,
minWidth
:
120
},
{
title
:
'手机'
,
key
:
'mobile'
,
align
:
'center'
,
minWidth
:
120
},
{
title
:
'归属部门'
,
key
:
'office_name'
,
align
:
'center'
,
minWidth
:
150
}
]
}
},
computed
:
{
visible
:
{
get
()
{
return
this
.
value
},
set
(
v
)
{
this
.
$emit
(
'input'
,
v
)
}
}
},
watch
:
{
visible
(
v
)
{
if
(
v
)
{
this
.
pager
.
pageNo
=
1
this
.
selectedRows
=
[]
this
.
filters
.
name
=
''
this
.
fetchList
()
}
}
},
methods
:
{
fetchList
()
{
this
.
loading
=
true
const
payload
=
{
pageNo
:
this
.
pager
.
pageNo
,
pageSize
:
this
.
pager
.
pageSize
,
params
:
this
.
filters
}
getUserMultiSelectorList
(
payload
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
const
data
=
ret
.
data
.
data
||
{}
this
.
rows
=
data
.
results
||
[]
this
.
pager
.
totalRecord
=
data
.
totalRecord
||
0
}
else
{
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
},
handleSearch
()
{
this
.
pager
.
pageNo
=
1
this
.
fetchList
()
},
handleReset
()
{
this
.
filters
=
{
name
:
''
}
this
.
pager
.
pageNo
=
1
this
.
fetchList
()
},
pageChange
(
pageNo
)
{
this
.
pager
.
pageNo
=
pageNo
this
.
fetchList
()
},
sizeChange
(
size
)
{
this
.
pager
.
pageSize
=
size
this
.
pager
.
pageNo
=
1
this
.
fetchList
()
},
onSelectionChange
(
list
)
{
this
.
selectedRows
=
list
||
[]
},
handleCancel
()
{
this
.
$emit
(
'cancel'
)
this
.
$emit
(
'input'
,
false
)
},
handleConfirm
()
{
if
(
this
.
selectedRows
.
length
===
0
)
{
this
.
$Message
.
warning
(
'请先选择人员'
)
return
}
this
.
confirming
=
true
// emit selected users to parent
this
.
$emit
(
'on-ok'
,
this
.
selectedRows
)
this
.
$emit
(
'input'
,
false
)
this
.
confirming
=
false
}
}
}
</
script
>
<
style
scoped
>
.search-div
{
border
:
1px
solid
#dce1e7
;
padding
:
12px
;
margin-bottom
:
12px
;
background-color
:
#f8fbff
;
}
.mr10
{
margin-right
:
10px
;
}
.page_style
{
margin-top
:
12px
;
text-align
:
right
;
}
.text-right
{
text-align
:
right
;
}
</
style
>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论