feat: 按创建人隔离采集采购任务 (#127)
This commit is contained in:
+34
-14
@@ -573,7 +573,7 @@ func (h *Handler) SybAssociatePdd(c *gin.Context) {
|
||||
|
||||
// SybCollectPdd 为货运单当前关联的 PDD 商品创建采集任务。
|
||||
func (h *Handler) SybCollectPdd(c *gin.Context) {
|
||||
result, err := service.CreateSybPddCollectTask(h.db, c.PostForm("syb_id"))
|
||||
result, err := service.CreateSybPddCollectTaskForUser(h.db, currentUser(c), c.PostForm("syb_id"))
|
||||
if err != nil {
|
||||
h.sybRedirect(c, "采集任务未创建:"+err.Error())
|
||||
return
|
||||
@@ -689,18 +689,25 @@ func (h *Handler) SybDelete(c *gin.Context) {
|
||||
|
||||
// TaskList 渲染「采集采购」列表页。
|
||||
func (h *Handler) TaskList(c *gin.Context) {
|
||||
actor := currentUser(c)
|
||||
creatorFilter := c.Query("creator")
|
||||
filter := repository.TaskFilter{
|
||||
Type: service.ParseTaskType(c.Query("type")),
|
||||
Status: service.ParseTaskStatus(c.Query("status")),
|
||||
Keyword: c.Query("q"),
|
||||
}
|
||||
|
||||
result, err := service.ListTasksView(h.db, filter, service.ParsePage(c.Query("page")))
|
||||
result, err := service.ListTasksViewForUser(h.db, actor, filter, creatorFilter, service.ParsePage(c.Query("page")))
|
||||
if err != nil {
|
||||
fail(c, http.StatusInternalServerError,
|
||||
"读取任务列表失败,数据没有被改动。刷新页面重试;一直失败请把这句话报给维护者。")
|
||||
return
|
||||
}
|
||||
creatorOptions, err := service.TaskCreatorOptions(h.db, actor)
|
||||
if err != nil {
|
||||
fail(c, http.StatusInternalServerError, "读取任务创建人筛选失败,请刷新页面重试。")
|
||||
return
|
||||
}
|
||||
|
||||
// 底部状态条平时显示统计,刚做完删除操作时先显示操作结果,
|
||||
// 跳转带过来的 msg 参数,见 h.taskRedirect。
|
||||
@@ -719,17 +726,23 @@ func (h *Handler) TaskList(c *gin.Context) {
|
||||
if strings.TrimSpace(filter.Keyword) != "" {
|
||||
values.Set("q", filter.Keyword)
|
||||
}
|
||||
if actor.IsAdmin() && creatorFilter != "" {
|
||||
values.Set("creator", creatorFilter)
|
||||
}
|
||||
c.HTML(http.StatusOK, "task/list", page(c, "tasks", "采集采购", gin.H{
|
||||
"Rows": result.Rows,
|
||||
"Keyword": filter.Keyword,
|
||||
"Status": statusLine,
|
||||
"TypeFilter": string(filter.Type),
|
||||
"StatusFilter": string(filter.Status),
|
||||
"TypeOptions": service.TaskTypeOptions(),
|
||||
"StatusOptions": service.TaskStatusOptions(),
|
||||
"IsFiltered": result.IsFiltered,
|
||||
"CurrentPage": result.Page,
|
||||
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
|
||||
"Rows": result.Rows,
|
||||
"Keyword": filter.Keyword,
|
||||
"Status": statusLine,
|
||||
"TypeFilter": string(filter.Type),
|
||||
"StatusFilter": string(filter.Status),
|
||||
"TypeOptions": service.TaskTypeOptions(),
|
||||
"StatusOptions": service.TaskStatusOptions(),
|
||||
"ShowCreator": actor.IsAdmin(),
|
||||
"CreatorFilter": creatorFilter,
|
||||
"CreatorOptions": creatorOptions,
|
||||
"IsFiltered": result.IsFiltered,
|
||||
"CurrentPage": result.Page,
|
||||
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -745,7 +758,7 @@ func (h *Handler) TaskDetail(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
detail, err := service.GetTaskDetail(h.db, taskID)
|
||||
detail, err := service.GetTaskDetailForUser(h.db, currentUser(c), taskID)
|
||||
if err != nil {
|
||||
fail(c, http.StatusInternalServerError, "读取任务详情失败,数据没有被改动。")
|
||||
return
|
||||
@@ -769,8 +782,12 @@ func (h *Handler) TaskDelete(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
n, err := service.DeleteTasks(h.db, ids)
|
||||
n, err := service.DeleteTasksForUser(h.db, currentUser(c), ids)
|
||||
if err != nil {
|
||||
if errors.Is(err, service.ErrTaskNotVisible) {
|
||||
fail(c, http.StatusBadRequest, "删除失败:所选任务不存在或不在当前账号可见范围。没有删除任何记录。")
|
||||
return
|
||||
}
|
||||
fail(c, http.StatusInternalServerError,
|
||||
"删除失败:"+err.Error()+"。没有删除任何记录。")
|
||||
return
|
||||
@@ -795,6 +812,9 @@ func (h *Handler) taskRedirect(c *gin.Context, msg string) {
|
||||
if p := c.PostForm("page"); p != "" {
|
||||
params.Set("page", p)
|
||||
}
|
||||
if creator := c.PostForm("creator"); creator != "" && currentUser(c).IsAdmin() {
|
||||
params.Set("creator", creator)
|
||||
}
|
||||
if msg != "" {
|
||||
params.Set("msg", msg)
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"cmautobuy/admin/model"
|
||||
)
|
||||
|
||||
func listPostContext(t *testing.T, path string, values url.Values) (*gin.Context, *httptest.ResponseRecorder) {
|
||||
@@ -67,11 +69,12 @@ func Test列表写操作跳转保留筛选和页码(t *testing.T) {
|
||||
})
|
||||
t.Run("任务", func(t *testing.T) {
|
||||
context, recorder := listPostContext(t, "/tasks/delete", url.Values{
|
||||
"q": {"TASK"}, "type": {"collect"}, "status": {"pending"}, "page": {"2"},
|
||||
"q": {"TASK"}, "type": {"collect"}, "status": {"pending"}, "creator": {"buyer-a"}, "page": {"2"},
|
||||
})
|
||||
context.Set(currentUserKey, &model.User{Role: model.RoleAdmin})
|
||||
(&Handler{}).taskRedirect(context, "完成")
|
||||
assertRedirectQuery(t, recorder, "/tasks", map[string]string{
|
||||
"q": "TASK", "type": "collect", "status": "pending", "page": "2", "msg": "完成",
|
||||
"q": "TASK", "type": "collect", "status": "pending", "creator": "buyer-a", "page": "2", "msg": "完成",
|
||||
})
|
||||
})
|
||||
t.Run("客户端", func(t *testing.T) {
|
||||
|
||||
@@ -242,7 +242,7 @@ func (h *Handler) ShopeeDelete(c *gin.Context) {
|
||||
//
|
||||
// `[不做]` 本工单(#38)明确不实现这个接口,保持 501。
|
||||
func (h *Handler) ShopeeCollect(c *gin.Context) {
|
||||
result, err := service.CreateShopeePddCollectTask(h.db, c.PostForm("shopee_goods_id"))
|
||||
result, err := service.CreateShopeePddCollectTaskForUser(h.db, currentUser(c), c.PostForm("shopee_goods_id"))
|
||||
if err != nil {
|
||||
h.shopeeRedirect(c, "采集任务未创建:"+err.Error())
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user