This commit is contained in:
hero920103 committed 2026-10-17 11:52:02 +08:00
1 parent 184d5b0403
commit a758966fae
18 files changed
+2002 -19

No files matched your search

+91
View File
@@ -307,6 +307,97 @@ func (c *AppOaController) ExpenseRecords() {
c.oaOk(rows)
}
// expenseActPayload 审批操作请求体。
type expenseActPayload struct {
Comment string `json:"comment"`
}
// expenseReadActPayload 读取审批意见(可空)。
func (c *AppOaController) expenseReadActPayload() string {
var payload expenseActPayload
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err == nil && len(raw) > 0 {
_ = json.Unmarshal(raw, &payload)
}
return strings.TrimSpace(payload.Comment)
}
// ExpenseApprove POST /api/oa/expense/approve/:id 通过当前审批节点(body: {comment})。
// 审批人视角:无需是单据创建人,只要是当前节点待办审批人即可操作。
func (c *AppOaController) ExpenseApprove() {
claims, err := c.oaClaims()
if err != nil {
c.oaErr(401, 401, "未登录或无权限")
return
}
id := c.oaScheduleIDParam()
if id == 0 {
c.oaErr(400, 400, "无效ID")
return
}
code, msg, hint := reimburseActCore(claims, id, true, c.expenseReadActPayload())
if msg != "" {
c.oaErr(code, code, msg)
return
}
c.oaOk(map[string]interface{}{"message": hint})
}
// ExpenseReject POST /api/oa/expense/reject/:id 驳回报销单(body: {comment})。
func (c *AppOaController) ExpenseReject() {
claims, err := c.oaClaims()
if err != nil {
c.oaErr(401, 401, "未登录或无权限")
return
}
id := c.oaScheduleIDParam()
if id == 0 {
c.oaErr(400, 400, "无效ID")
return
}
code, msg, hint := reimburseActCore(claims, id, false, c.expenseReadActPayload())
if msg != "" {
c.oaErr(code, code, msg)
return
}
c.oaOk(map[string]interface{}{"message": hint})
}
// ExpenseMyApproveTask GET /api/oa/expense/my-approve-task/:id
// 查当前用户在该单据上的待审批任务:返回 {task_id,node_name},无待办返回 data=null。
// 小程序详情页据此决定是否展示「通过/驳回」按钮。
func (c *AppOaController) ExpenseMyApproveTask() {
claims, err := c.oaClaims()
if err != nil {
c.oaErr(401, 401, "未登录或无权限")
return
}
id := c.oaScheduleIDParam()
if id == 0 {
c.oaErr(400, 400, "无效ID")
return
}
task, err := reimburseMyTaskCore(claims, id)
if err != nil {
c.oaErr(500, 500, "查询审批任务失败")
return
}
if task == nil {
c.oaOk(nil)
return
}
c.oaOk(map[string]interface{}{
"task_id": task.ID,
"node_name": task.NodeName,
})
}
// ExpenseTypes GET /api/oa/expense/types 费用类型下拉(全局通用 + 本租户专有,仅启用)。
func (c *AppOaController) ExpenseTypes() {
claims, err := c.oaClaims()