Compare commits

...

2 Commits

Author SHA1 Message Date
f7b2d2c3bf Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-03-19 15:30:41 +08:00
1207072092 feat(wms): 新增用印审批功能
- 在审批API中添加按业务ID查询审批信息的方法
- 配置用印详情页面路由,支持通过业务ID查看用印详情
- 修改待办列表,为用印类型申请隐藏同意驳回按钮
- 在待办列表数据中添加业务ID字段,完善申请类型映射
- 更新审批服务接口和实现类,添加queryByBizId方法
- 重构用印详情页面,集成审批信息加载和权限校验逻辑
- 更新领域模型中的申请类型枚举,添加用印类型支持
- 完善审批任务服务,支持用印申请详情查询和申请人姓名显示
2026-03-19 15:30:28 +08:00
13 changed files with 166 additions and 30 deletions

View File

@@ -55,3 +55,14 @@ export function withdrawApproval(approvalId) {
} }
}) })
} }
/**
* 按业务ID查询审批信息用于用印等业务
*/
export function getApprovalByBizId(bizId) {
return request({
url: '/wms/approval/getByBizId',
method: 'get',
params: { bizId }
})
}

View File

@@ -125,6 +125,19 @@ export const constantRoutes = [
meta: { title: '工厂总日历' } meta: { title: '工厂总日历' }
} }
] ]
},
{
path: '/wms/seal',
component: Layout,
hidden: true,
children: [
{
path: 'sealDetail/:bizId',
component: () => import('@/views/wms/seal/sealDetail'),
name: 'WmsSealDetail',
meta: { title: '用印详情' }
}
]
} }
] ]

View File

@@ -126,6 +126,7 @@
> >
详情 详情
</el-button> </el-button>
<template v-if="scope.row.applyType !== 'seal'">
<el-button <el-button
v-if="scope.row.taskStatus === 'pending'" v-if="scope.row.taskStatus === 'pending'"
size="small" size="small"
@@ -145,6 +146,7 @@
驳回 驳回
</el-button> </el-button>
</template> </template>
</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -274,7 +276,8 @@ export default {
applyType: item.approval.applyType, applyType: item.approval.applyType,
approverName: item.approval.approverName, approverName: item.approval.approverName,
taskId: item.task.taskId, taskId: item.task.taskId,
...item.detail, // 合并请假/外出的详情字段 bizId: item.approval.applyId,
...item.detail,
} }
}) })
this.total = res.total this.total = res.total
@@ -323,7 +326,13 @@ export default {
// 查看详情 // 查看详情
handleDetail(row) { handleDetail(row) {
this.currentDetail = { ...row } // 深拷贝避免原数据被修改 if (row.applyType === 'seal') {
this.$router.push({
path: `/wms/seal/sealDetail/${row.bizId}`
})
return
}
this.currentDetail = { ...row }
this.detailDialogVisible = true this.detailDialogVisible = true
}, },
@@ -427,6 +436,7 @@ export default {
const textMap = { const textMap = {
'leave': '请假', 'leave': '请假',
'out': '外出', 'out': '外出',
'seal': '用印',
} }
return textMap[type] || '未知类型' return textMap[type] || '未知类型'
}, },

View File

@@ -223,7 +223,12 @@ export default {
}) })
}, },
goDetail(row) { goDetail(row) {
this.$router.push({ path: '/job/sealDetail', query: { bizId: row.bizId } }) // if (row.applyType === 'seal') {
this.$router.push({
path: `/wms/seal/sealDetail/${row.bizId}`
})
return
// }
}, },
canPreviewReceipt(row) { canPreviewReceipt(row) {
return row.status === 'approved' && row.receiptFileIds return row.status === 'approved' && row.receiptFileIds

View File

@@ -150,6 +150,7 @@
<script> <script>
import { getSealReq, rejectSealReq, approveSealReq, stampSealJava } from '@/api/wms/seal' import { getSealReq, rejectSealReq, approveSealReq, stampSealJava } from '@/api/wms/seal'
import { getApprovalByBizId } from '@/api/wms/approval'
import { listByIds } from '@/api/system/oss' import { listByIds } from '@/api/system/oss'
import PdfStamper from '@/components/PdfStamper/index.vue' import PdfStamper from '@/components/PdfStamper/index.vue'
@@ -168,6 +169,7 @@ export default {
stamping: false, stamping: false,
actionSubmitting: false, actionSubmitting: false,
actionRemark: '', actionRemark: '',
approvalInfo: null,
stampForm: { stampForm: {
pageNo: 1, pageNo: 1,
stampImageUrl: '', stampImageUrl: '',
@@ -191,8 +193,18 @@ export default {
return this.seal.empId ? `员工ID:${this.seal.empId}` : '-' return this.seal.empId ? `员工ID:${this.seal.empId}` : '-'
}, },
canApprove() { canApprove() {
if (!this.approvalInfo || !this.approvalInfo.task) {
return false
}
const currentUserId = this.$store.getters.id const currentUserId = this.$store.getters.id
return this.seal.status === 'running' && String(this.seal.approverId) === String(currentUserId) const task = this.approvalInfo.task
console.log('canApprove check:', {
currentUserId,
approverId: task.approverId,
status: this.seal.status,
taskStatus: task.taskStatus
})
return this.seal.status === 'running' && task.taskStatus === 'pending' && Number(task.approverId) === Number(currentUserId)
} }
}, },
created() { created() {
@@ -223,12 +235,20 @@ export default {
try { try {
const res = await getSealReq(bizId) const res = await getSealReq(bizId)
this.seal = res.data || {} this.seal = res.data || {}
this.seal.approverId = this.seal.approverId || this.seal.approver_id || this.seal.approverUserId
await this.loadAttachments() await this.loadAttachments()
await this.loadApprovalInfo()
} finally { } finally {
this.loading = false this.loading = false
} }
}, },
async loadApprovalInfo() {
try {
const res = await getApprovalByBizId(this.currentBizId)
this.approvalInfo = res.data || null
} catch (e) {
this.approvalInfo = null
}
},
async loadAttachments() { async loadAttachments() {
const fileIds = this.seal.applyFileIds const fileIds = this.seal.applyFileIds
if (!fileIds) { if (!fileIds) {
@@ -353,6 +373,10 @@ export default {
} }
}, },
async reject() { async reject() {
if (!this.canApprove) {
this.$message.warning('你不是当前审批人')
return
}
this.actionSubmitting = true this.actionSubmitting = true
try { try {
await rejectSealReq(this.currentBizId, this.actionRemark) await rejectSealReq(this.currentBizId, this.actionRemark)

View File

@@ -156,4 +156,14 @@ public class WmsApprovalController extends BaseController {
@RequestParam Long approvalId) { @RequestParam Long approvalId) {
return R.ok(iWmsApprovalService.cancelApproval(approvalId)); return R.ok(iWmsApprovalService.cancelApproval(approvalId));
} }
/**
* 按业务ID查询审批信息用于用印等业务
*
* @param bizId 业务ID
*/
@GetMapping("/getByBizId")
public R<Map<String, Object>> getByBizId(@RequestParam Long bizId) {
return R.ok(iWmsApprovalService.queryByBizId(bizId));
}
} }

View File

@@ -27,7 +27,7 @@ public class WmsApproval extends BaseEntity {
@TableId(value = "approval_id") @TableId(value = "approval_id")
private Long approvalId; private Long approvalId;
/** /**
* 申请类型leave=请假out=外出) * 申请类型leave=请假out=外出seal=用印
*/ */
private String applyType; private String applyType;
/** /**

View File

@@ -25,7 +25,7 @@ public class WmsApprovalBo extends BaseEntity {
private Long approvalId; private Long approvalId;
/** /**
* 申请类型leave=请假out=外出) * 申请类型leave=请假out=外出seal=用印
*/ */
private String applyType; private String applyType;

View File

@@ -28,10 +28,10 @@ public class WmsApprovalVo {
private Long approvalId; private Long approvalId;
/** /**
* 申请类型leave=请假out=外出) * 申请类型leave=请假out=外出seal=用印
*/ */
@ExcelProperty(value = "申请类型", converter = ExcelDictConvert.class) @ExcelProperty(value = "申请类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "l=eave=请假out=外出") @ExcelDictFormat(readConverterExp = "leave=请假,out=外出,seal=用印")
private String applyType; private String applyType;
/** /**

View File

@@ -47,4 +47,6 @@ public class WmsSealReqVo implements Serializable {
private Date createTime; private Date createTime;
private String updateBy; private String updateBy;
private Date updateTime; private Date updateTime;
private String applicantName;
} }

View File

@@ -73,4 +73,12 @@ public interface IWmsApprovalService {
* @return 操作结果 * @return 操作结果
*/ */
Map<String, Object> cancelApproval(Long approvalId); Map<String, Object> cancelApproval(Long approvalId);
/**
* 按业务ID查询审批信息用于用印等业务
*
* @param bizId 业务ID
* @return 审批信息包含任务详情
*/
Map<String, Object> queryByBizId(Long bizId);
} }

View File

@@ -549,4 +549,25 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService {
return result; return result;
} }
@Override
public Map<String, Object> queryByBizId(Long bizId) {
Map<String, Object> result = new HashMap<>();
if (bizId == null) {
return result;
}
LambdaQueryWrapper<WmsApproval> lqw = Wrappers.lambdaQuery();
lqw.eq(WmsApproval::getApplyId, bizId);
lqw.eq(WmsApproval::getApplyType, "seal");
lqw.eq(WmsApproval::getDelFlag, 0);
WmsApprovalVo approval = baseMapper.selectVoOne(lqw);
if (approval == null) {
return result;
}
result.put("approval", approval);
result.put("applyType", approval.getApplyType());
List<WmsApprovalTaskVo> tasks = approvalTaskService.queryByApprovalId(approval.getApprovalId());
result.put("task", tasks != null && !tasks.isEmpty() ? tasks.get(0) : null);
return result;
}
} }

View File

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery; import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.service.UserService;
import com.klp.common.utils.StringUtils; import com.klp.common.utils.StringUtils;
import com.klp.domain.WmsApprovalTask; import com.klp.domain.WmsApprovalTask;
import com.klp.domain.bo.WmsApprovalTaskBo; import com.klp.domain.bo.WmsApprovalTaskBo;
@@ -14,6 +15,8 @@ import com.klp.domain.vo.WmsApprovalTaskVo;
import com.klp.domain.vo.WmsApprovalVo; import com.klp.domain.vo.WmsApprovalVo;
import com.klp.domain.vo.WmsLeaveRequestVo; import com.klp.domain.vo.WmsLeaveRequestVo;
import com.klp.domain.vo.WmsOutRequestVo; import com.klp.domain.vo.WmsOutRequestVo;
import com.klp.domain.vo.WmsSealReqVo;
import com.klp.mapper.WmsSealReqMapper;
import com.klp.mapper.WmsApprovalTaskMapper; import com.klp.mapper.WmsApprovalTaskMapper;
import com.klp.mapper.WmsApprovalMapper; import com.klp.mapper.WmsApprovalMapper;
import com.klp.mapper.WmsLeaveRequestMapper; import com.klp.mapper.WmsLeaveRequestMapper;
@@ -40,7 +43,9 @@ public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService {
private final WmsApprovalMapper approvalMapper; private final WmsApprovalMapper approvalMapper;
private final WmsLeaveRequestMapper leaveRequestMapper; private final WmsLeaveRequestMapper leaveRequestMapper;
private final WmsOutRequestMapper outRequestMapper; private final WmsOutRequestMapper outRequestMapper;
private final ISysUserService userService; private final WmsSealReqMapper sealRequestMapper;
private final UserService userService;
private final ISysUserService sysUserService;
@Override @Override
public WmsApprovalTaskVo queryById(Long taskId) { public WmsApprovalTaskVo queryById(Long taskId) {
@@ -73,6 +78,7 @@ public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService {
// 收集所有applyId按类型分别查询 // 收集所有applyId按类型分别查询
Set<String> userNames = new HashSet<>(); Set<String> userNames = new HashSet<>();
Set<Long> empIds = new HashSet<>();
Map<String, Object> detailMap = new HashMap<>(); Map<String, Object> detailMap = new HashMap<>();
for (WmsApprovalTaskVo task : taskList) { for (WmsApprovalTaskVo task : taskList) {
@@ -97,6 +103,12 @@ public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService {
if (outDetail != null && StringUtils.isNotBlank(outDetail.getCreateBy())) { if (outDetail != null && StringUtils.isNotBlank(outDetail.getCreateBy())) {
userNames.add(outDetail.getCreateBy()); userNames.add(outDetail.getCreateBy());
} }
} else if ("seal".equalsIgnoreCase(applyType)) {
WmsSealReqVo sealDetail = sealRequestMapper.selectVoById(applyId);
detailMap.put("seal_" + applyId, sealDetail);
if (sealDetail != null && sealDetail.getEmpId() != null) {
empIds.add(sealDetail.getEmpId());
}
} }
} }
} }
@@ -104,7 +116,18 @@ public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService {
// 批量查询昵称 // 批量查询昵称
Map<String, String> nickMap = Collections.emptyMap(); Map<String, String> nickMap = Collections.emptyMap();
if (!userNames.isEmpty()) { if (!userNames.isEmpty()) {
nickMap = userService.selectNickNameMapByUserNames(new ArrayList<>(userNames)); nickMap = sysUserService.selectNickNameMapByUserNames(new ArrayList<>(userNames));
}
// 批量查询empId对应的昵称用于用印申请
Map<Long, String> empNickMap = new HashMap<>();
if (!empIds.isEmpty()) {
for (Long empId : empIds) {
String nickName = userService.selectNickNameById(empId);
if (StringUtils.isNotBlank(nickName)) {
empNickMap.put(empId, nickName);
}
}
} }
// 组装返回结果 // 组装返回结果
@@ -139,6 +162,15 @@ public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService {
item.put("detail", outDetail); item.put("detail", outDetail);
item.put("applyType", "out"); item.put("applyType", "out");
} }
} else if ("seal".equalsIgnoreCase(applyType)) {
WmsSealReqVo sealDetail = (WmsSealReqVo) detailMap.get("seal_" + applyId);
if (sealDetail != null) {
if (sealDetail.getEmpId() != null) {
sealDetail.setApplicantName(empNickMap.getOrDefault(sealDetail.getEmpId(), String.valueOf(sealDetail.getEmpId())));
}
item.put("detail", sealDetail);
item.put("applyType", "seal");
}
} }
} }
} }