feat(erp): 为请购单增加审批意见功能

- 在ErpPurchaseRequisition实体类中添加一审和二审审批意见字段
- 在ErpPurchaseRequisitionBo和ErpPurchaseRequisitionVo中同步添加审批意见字段
- 修改approve和reject方法接口,支持传递审批意见参数
- 在服务实现层将审批意见保存到对应字段中
- 更新前端控制器接收审批意见参数并传递给服务层
- 在前端页面显示审批意见,并调整审批进度布局样式
- 添加数据库表结构变更SQL脚本,增加审批意见字段
This commit is contained in:
jhd
2026-07-08 11:37:35 +08:00
parent dde1ade8b9
commit 3acb6d7f54
9 changed files with 56 additions and 17 deletions

View File

@@ -0,0 +1,7 @@
-- ========================================
-- 电子请购单 — 增量变更 1增加审批意见字段
-- ========================================
ALTER TABLE `erp_purchase_requisition`
ADD COLUMN `first_approval_opinion` VARCHAR(500) DEFAULT NULL COMMENT '一审审批意见' AFTER `remark`,
ADD COLUMN `second_approval_opinion` VARCHAR(500) DEFAULT NULL COMMENT '二审审批意见' AFTER `first_approval_opinion`;

View File

@@ -94,14 +94,16 @@ public class ErpPurchaseRequisitionController extends BaseController {
/** 审批通过(审批中 → 已通过) */ /** 审批通过(审批中 → 已通过) */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE) @Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@PutMapping("/{reqId}/approve") @PutMapping("/{reqId}/approve")
public R<Void> approve(@NotNull(message = "主键不能为空") @PathVariable Long reqId) { public R<Void> approve(@NotNull(message = "主键不能为空") @PathVariable Long reqId,
return toAjax(iErpPurchaseRequisitionService.approve(reqId)); @RequestParam(required = false) String approvalOpinion) {
return toAjax(iErpPurchaseRequisitionService.approve(reqId, approvalOpinion));
} }
/** 驳回(审批中 → 已驳回) */ /** 驳回(审批中 → 已驳回) */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE) @Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@PutMapping("/{reqId}/reject") @PutMapping("/{reqId}/reject")
public R<Void> reject(@NotNull(message = "主键不能为空") @PathVariable Long reqId) { public R<Void> reject(@NotNull(message = "主键不能为空") @PathVariable Long reqId,
return toAjax(iErpPurchaseRequisitionService.reject(reqId)); @RequestParam(required = false) String approvalOpinion) {
return toAjax(iErpPurchaseRequisitionService.reject(reqId, approvalOpinion));
} }
} }

View File

@@ -106,6 +106,12 @@ public class ErpPurchaseRequisition extends BaseEntity {
@TableLogic @TableLogic
private String delFlag; private String delFlag;
/** 一审审批意见 */
private String firstApprovalOpinion;
/** 二审审批意见 */
private String secondApprovalOpinion;
/** 备注 */ /** 备注 */
private String remark; private String remark;
} }

View File

@@ -100,6 +100,12 @@ public class ErpPurchaseRequisitionBo extends BaseEntity {
/** 状态 */ /** 状态 */
private String formStatus; private String formStatus;
/** 一审审批意见 */
private String firstApprovalOpinion;
/** 二审审批意见 */
private String secondApprovalOpinion;
/** 备注 */ /** 备注 */
private String remark; private String remark;

View File

@@ -100,6 +100,12 @@ public class ErpPurchaseRequisitionVo implements Serializable {
@ExcelProperty(value = "状态") @ExcelProperty(value = "状态")
private String formStatus; private String formStatus;
@ExcelProperty(value = "一审审批意见")
private String firstApprovalOpinion;
@ExcelProperty(value = "二审审批意见")
private String secondApprovalOpinion;
@ExcelProperty(value = "备注") @ExcelProperty(value = "备注")
private String remark; private String remark;

View File

@@ -38,8 +38,8 @@ public interface IErpPurchaseRequisitionService {
Boolean submitApproval(Long reqId, Long firstApproverId, String firstApproverName); Boolean submitApproval(Long reqId, Long firstApproverId, String firstApproverName);
/** 审批通过(审批中 → 已通过) */ /** 审批通过(审批中 → 已通过) */
Boolean approve(Long reqId); Boolean approve(Long reqId, String approvalOpinion);
/** 驳回(审批中 → 已驳回) */ /** 驳回(审批中 → 已驳回) */
Boolean reject(Long reqId); Boolean reject(Long reqId, String approvalOpinion);
} }

View File

@@ -149,7 +149,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean approve(Long reqId) { public Boolean approve(Long reqId, String approvalOpinion) {
ErpPurchaseRequisition entity = baseMapper.selectById(reqId); ErpPurchaseRequisition entity = baseMapper.selectById(reqId);
if (entity == null) return false; if (entity == null) return false;
String currentNickName = LoginHelper.getNickName(); String currentNickName = LoginHelper.getNickName();
@@ -161,6 +161,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
throw new RuntimeException("您不是该请购单指定的审批人"); throw new RuntimeException("您不是该请购单指定的审批人");
} }
entity.setFormStatus("6"); entity.setFormStatus("6");
entity.setFirstApprovalOpinion(approvalOpinion);
return baseMapper.updateById(entity) > 0; return baseMapper.updateById(entity) > 0;
} else if ("6".equals(entity.getFormStatus())) { } else if ("6".equals(entity.getFormStatus())) {
@@ -170,6 +171,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
} }
entity.setFormStatus("2"); entity.setFormStatus("2");
entity.setSignRequestGm("陈清鑫"); entity.setSignRequestGm("陈清鑫");
entity.setSecondApprovalOpinion(approvalOpinion);
return baseMapper.updateById(entity) > 0; return baseMapper.updateById(entity) > 0;
} else { } else {
@@ -179,7 +181,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean reject(Long reqId) { public Boolean reject(Long reqId, String approvalOpinion) {
ErpPurchaseRequisition entity = baseMapper.selectById(reqId); ErpPurchaseRequisition entity = baseMapper.selectById(reqId);
if (entity == null) return false; if (entity == null) return false;
String currentNickName = LoginHelper.getNickName(); String currentNickName = LoginHelper.getNickName();
@@ -191,6 +193,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
throw new RuntimeException("您不是该请购单指定的审批人"); throw new RuntimeException("您不是该请购单指定的审批人");
} }
entity.setFormStatus("5"); entity.setFormStatus("5");
entity.setFirstApprovalOpinion(approvalOpinion);
return baseMapper.updateById(entity) > 0; return baseMapper.updateById(entity) > 0;
} else if ("6".equals(entity.getFormStatus())) { } else if ("6".equals(entity.getFormStatus())) {
@@ -199,6 +202,7 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
throw new RuntimeException("二审仅限指定审批人操作"); throw new RuntimeException("二审仅限指定审批人操作");
} }
entity.setFormStatus("5"); entity.setFormStatus("5");
entity.setSecondApprovalOpinion(approvalOpinion);
return baseMapper.updateById(entity) > 0; return baseMapper.updateById(entity) > 0;
} else { } else {

View File

@@ -45,18 +45,20 @@ export function submitApproval(reqId, firstApproverId, firstApproverName) {
} }
// 审批通过 // 审批通过
export function approvePurchase(reqId) { export function approvePurchase(reqId, approvalOpinion) {
return request({ return request({
url: '/erp/purchaseRequisition/' + reqId + '/approve', url: '/erp/purchaseRequisition/' + reqId + '/approve',
method: 'put' method: 'put',
params: { approvalOpinion }
}) })
} }
// 驳回 // 驳回
export function rejectPurchase(reqId) { export function rejectPurchase(reqId, approvalOpinion) {
return request({ return request({
url: '/erp/purchaseRequisition/' + reqId + '/reject', url: '/erp/purchaseRequisition/' + reqId + '/reject',
method: 'put' method: 'put',
params: { approvalOpinion }
}) })
} }

View File

@@ -363,9 +363,15 @@
<!-- 审批进度 --> <!-- 审批进度 -->
<div class="pv-section-title" style="margin-top:14px">审批进度</div> <div class="pv-section-title" style="margin-top:14px">审批进度</div>
<div style="display:flex;gap:24px;padding:8px 0;font-size:13px"> <div style="padding:8px 0;font-size:13px">
<div style="margin-bottom:10px">
<div><label style="color:#909399">一审人</label><span>{{ viewForm.signPurchaseHandler || '待审批' }}</span></div> <div><label style="color:#909399">一审人</label><span>{{ viewForm.signPurchaseHandler || '待审批' }}</span></div>
<div v-if="viewForm.firstApprovalOpinion" style="margin:4px 0 0 62px;color:#606266;font-size:12px;padding:4px 10px;background:#f5f7fa;border-radius:3px;display:inline-block">意见{{ viewForm.firstApprovalOpinion }}</div>
</div>
<div>
<div><label style="color:#909399">二审人陈清鑫</label><span>{{ viewForm.signRequestGm || '待审批' }}</span></div> <div><label style="color:#909399">二审人陈清鑫</label><span>{{ viewForm.signRequestGm || '待审批' }}</span></div>
<div v-if="viewForm.secondApprovalOpinion" style="margin:4px 0 0 124px;color:#606266;font-size:12px;padding:4px 10px;background:#f5f7fa;border-radius:3px;display:inline-block">意见{{ viewForm.secondApprovalOpinion }}</div>
</div>
</div> </div>
</div> </div>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@@ -766,7 +772,7 @@ export default {
// 审批通过 // 审批通过
doApprove() { doApprove() {
this.approvalLoading = true this.approvalLoading = true
approvePurchase(this.approvalReq.reqId).then(() => { approvePurchase(this.approvalReq.reqId, this.approvalRemark).then(() => {
this.$modal.msgSuccess('审批通过') this.$modal.msgSuccess('审批通过')
this.approvalOpen = false this.approvalOpen = false
this.getList() this.getList()
@@ -775,7 +781,7 @@ export default {
// 驳回 // 驳回
doReject() { doReject() {
this.approvalLoading = true this.approvalLoading = true
rejectPurchase(this.approvalReq.reqId).then(() => { rejectPurchase(this.approvalReq.reqId, this.approvalRemark).then(() => {
this.$modal.msgSuccess('已驳回') this.$modal.msgSuccess('已驳回')
this.approvalOpen = false this.approvalOpen = false
this.getList() this.getList()