diff --git a/app/admin/enum/enum_staff.go b/app/admin/enum/enum_staff.go new file mode 100644 index 0000000..aedea17 --- /dev/null +++ b/app/admin/enum/enum_staff.go @@ -0,0 +1,19 @@ +package enum + +type StaffSex int32 + +const ( + StaffSexForMan = 1 + StaffSexForWomen = 2 +) + +func (gt StaffSex) String() string { + switch gt { + case StaffSexForMan: + return "男" + case StaffSexForWomen: + return "女" + default: + return "未知" + } +} diff --git a/app/admin/hdl/hdl_staff.go b/app/admin/hdl/hdl_staff.go new file mode 100644 index 0000000..8641694 --- /dev/null +++ b/app/admin/hdl/hdl_staff.go @@ -0,0 +1,147 @@ +package hdl + +import ( + "applet/app/admin/enum" + "applet/app/admin/lib/validate" + "applet/app/admin/md" + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "github.com/gin-gonic/gin" + "time" +) + +func StaffList(c *gin.Context) { + var req md.StaffListReq + err := c.ShouldBindJSON(&req) + if err != nil { + err = validate.HandleValidateErr(err) + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + } + staffDb := db.StaffDb{} + staffDb.Set() + engine := staffDb.Db.Desc("id").Limit(req.Limit, (req.Page-1)*req.Limit) + if req.Name != "" { + engine.And("name like ?", "%"+req.Name+"%") + } + if req.IdNo != "" { + engine.And("id_no like ?", "%"+req.IdNo+"%") + } + if req.Phone != "" { + engine.And("phone like ?", "%"+req.Phone+"%") + } + + var list []model.Staff + count, err := engine.FindAndCount(&list) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err.Error()) + return + } + + e.OutSuc(c, map[string]interface{}{ + "list": list, + "state": []map[string]interface{}{ + { + "name": enum.StaffSex(enum.StaffSexForMan).String(), + "value": enum.StaffSexForMan, + }, + { + "name": enum.StaffSex(enum.StaffSexForWomen).String(), + "value": enum.StaffSexForWomen, + }, + }, + "total": count, + }, nil) + return +} + +func StaffDelete(c *gin.Context) { + var req md.StaffDeleteReq + err := c.ShouldBindJSON(&req) + if err != nil { + err = validate.HandleValidateErr(err) + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + } + staffDb := db.StaffDb{} + staffDb.Set() + _, err = staffDb.StaffDelete(req.Ids) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err.Error()) + return + } + e.OutSuc(c, "success", nil) + return +} + +func StaffAdd(c *gin.Context) { + var req md.StaffAddReq + err := c.ShouldBindJSON(&req) + if err != nil { + err = validate.HandleValidateErr(err) + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + } + staffDb := db.StaffDb{} + staffDb.Set() + now := time.Now() + staff := model.Staff{ + Name: req.Name, + Sex: req.Sex, + IdNo: req.IdNo, + Phone: req.Phone, + NativePlace: req.NativePlace, + Department: req.Department, + CreateAt: now.Format("2006-01-02 15:04:05"), + UpdateAt: now.Format("2006-01-02 15:04:05"), + } + _, err = staffDb.StaffInsert(&staff) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err.Error()) + return + } + + e.OutSuc(c, "success", nil) + return +} + +func StaffUpdate(c *gin.Context) { + var req md.StaffUpdateReq + err := c.ShouldBindJSON(&req) + if err != nil { + err = validate.HandleValidateErr(err) + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + } + staffDb := db.StaffDb{} + staffDb.Set() + staff, err := staffDb.GetStaff(req.Id) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err.Error()) + return + } + if staff == nil { + e.OutErr(c, e.ERR_NO_DATA, "未查询到对应记录") + return + } + now := time.Now() + staff.Name = req.Name + staff.Sex = req.Sex + staff.IdNo = req.IdNo + staff.Phone = req.Phone + staff.NativePlace = req.NativePlace + staff.Department = req.Department + staff.UpdateAt = now.Format("2006-01-02 15:04:05") + _, err = staffDb.StaffUpdate(staff, "name", "sex", "id_no", "phone", "native_place", "department", "update_at") + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err.Error()) + return + } + e.OutSuc(c, "success", nil) + return +} diff --git a/app/admin/hdl/order/hdl_order_list.go b/app/admin/hdl/order/hdl_order_list.go index 4040f94..6a755be 100644 --- a/app/admin/hdl/order/hdl_order_list.go +++ b/app/admin/hdl/order/hdl_order_list.go @@ -9,6 +9,10 @@ func OrderList(c *gin.Context) { order.OrderList(c) } +func OrderExport(c *gin.Context) { + order.OrderExport(c) +} + func OrderTotal(c *gin.Context) { order.OrderTotal(c) } diff --git a/app/admin/md/md_staff.go b/app/admin/md/md_staff.go new file mode 100644 index 0000000..473ec57 --- /dev/null +++ b/app/admin/md/md_staff.go @@ -0,0 +1,33 @@ +package md + +type StaffListReq struct { + Limit int `json:"limit"` + Page int `json:"page" ` + Name string `json:"name" label:"姓名"` + Phone string `json:"phone" label:"负责人手机号"` + IdNo string `json:"id_no" label:"身份证号码"` +} + +type StaffDeleteReq struct { + Ids []int `json:"ids"` +} + +type StaffAddReq struct { + Name string `json:"name"` + Sex int `json:"sex"` + IdNo string `json:"id_no"` + Phone string `json:"phone"` + NativePlace string `json:"native_place"` + Department string `json:"department"` +} + +type StaffUpdateReq struct { + Id int `json:"id" binding:"required"` + Name string `json:"name"` + Sex int `json:"sex"` + IdNo string `json:"id_no"` + Phone string `json:"phone"` + NativePlace string `json:"native_place"` + Department string `json:"department"` + CreateAt string `json:"create_at"` +} diff --git a/app/admin/svc/order/svc_order_list.go b/app/admin/svc/order/svc_order_list.go index 33c0f2b..882c26f 100644 --- a/app/admin/svc/order/svc_order_list.go +++ b/app/admin/svc/order/svc_order_list.go @@ -9,8 +9,10 @@ import ( "applet/app/utils" "encoding/json" "fmt" + "github.com/360EntSecGroup-Skylar/excelize" "github.com/gin-gonic/gin" "github.com/tidwall/gjson" + "strconv" ) func OrderList(c *gin.Context) { @@ -73,6 +75,66 @@ func OrderList(c *gin.Context) { return } +func OrderExport(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + eg := db.Db + list, _ := db.GetOrderListExport(eg, args) + + titleList := []string{"订单编号", "金额", "手机号", "企业名称", "学校名称", "状态", "送达时间", "订单时间"} + xlsx := excelize.NewFile() + xlsx.SetSheetRow("Sheet1", "A1", &titleList) + style, err := xlsx.NewStyle(`{"fill":{"type":"pattern","color":["FFFF00"],"pattern":1}, "alignment":{"horizontal":"center"}}`) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + xlsx.SetCellStyle("Sheet1", "A1", "M1", style) + xlsx.SetColWidth("Sheet1", "A", "A", 35) + xlsx.SetColWidth("Sheet1", "B", "B", 30) + xlsx.SetColWidth("Sheet1", "C", "E", 15) + xlsx.SetColWidth("Sheet1", "F", "I", 10) + xlsx.SetColWidth("Sheet1", "J", "J", 20) + xlsx.SetColWidth("Sheet1", "K", "K", 10) + xlsx.SetColWidth("Sheet1", "L", "L", 25) + xlsx.SetColWidth("Sheet1", "M", "M", 15) + //表头被第一行用了,只能从第二行开始 + j := 2 + + if list != nil { + stateArr := []string{"待制作", "制作中", "制作完成", "烘焙完成", "分拣完成", "已取消"} + enterpriseIds := make([]int, 0) + for _, v := range *list { + enterpriseIds = append(enterpriseIds, v.EnterpriseId) + } + enterpriseMap := db.GetEnterpriseMore(eg, enterpriseIds) + for _, v := range *list { + v1 := JudgePackageOrdOrdState(&v) + enterpriseName := "" + _, ok := enterpriseMap[v.EnterpriseId] + if ok { + enterpriseName = enterpriseMap[v.EnterpriseId].Name + } + + xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{ + utils.Int64ToStr(v1.Oid), v1.Amount, v1.BuyPhone, enterpriseName, stateArr[v1.State], + gjson.Get(v1.BuyInfo, "date").String() + " " + gjson.Get(v1.BuyInfo, "time").String(), v1.CreateAt.Format("2006-01-02 15:04:05"), + }) + j++ + } + } + + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Disposition", "attachment; filename="+"订单记录"+".xlsx") + c.Header("Content-Transfer-Encoding", "binary") + //回写到web 流媒体 形成下载 + _ = xlsx.Write(c.Writer) + return +} + // JudgePackageOrdOrdState 判断订单状态 func JudgePackageOrdOrdState(ord *model.Order) *model.Order { if ord.State == 5 { diff --git a/app/db/db_order_list.go b/app/db/db_order_list.go index 89dc9ab..8ad9cae 100644 --- a/app/db/db_order_list.go +++ b/app/db/db_order_list.go @@ -41,6 +41,7 @@ func GetOrderGoodsBySkuIdSess(sess *xorm.Session, oid, skuId string) *model.Orde } return &order } + func GetOrderList(eg *xorm.Engine, param map[string]string) (*[]model.Order, int64) { var order []model.Order sess := eg.Where("1=1") @@ -53,6 +54,12 @@ func GetOrderList(eg *xorm.Engine, param map[string]string) (*[]model.Order, int if param["state"] != "" { sess.And("state =?", param["state"]) } + if param["start_at"] != "" { + sess.And("create_at >= ?", param["start_at"]) + } + if param["end_at"] != "" { + sess.And("create_at <= ?", param["end_at"]) + } if param["enterprise_name"] != "" { var enterprise []model.Enterprise eg.Where("name like ?", "%"+param["enterprise_name"]+"%").Find(&enterprise) @@ -70,6 +77,41 @@ func GetOrderList(eg *xorm.Engine, param map[string]string) (*[]model.Order, int } return &order, count } + +func GetOrderListExport(eg *xorm.Engine, param map[string]string) (*[]model.Order, int64) { + var order []model.Order + sess := eg.Where("1=1") + if param["phone"] != "" { + sess.And("buy_phone like ?", "%"+param["phone"]+"%") + } + if param["oid"] != "" { + sess.And("oid like ?", "%"+param["oid"]+"%") + } + if param["state"] != "" { + sess.And("state =?", param["state"]) + } + if param["start_at"] != "" { + sess.And("create_at >= ?", param["start_at"]) + } + if param["end_at"] != "" { + sess.And("create_at <= ?", param["end_at"]) + } + if param["enterprise_name"] != "" { + var enterprise []model.Enterprise + eg.Where("name like ?", "%"+param["enterprise_name"]+"%").Find(&enterprise) + oids := []int{-1} + for _, v := range enterprise { + oids = append(oids, v.Id) + } + sess.In("enterprise_id", oids) + } + count, err := sess.OrderBy("id desc").FindAndCount(&order) + if err != nil { + return nil, count + } + return &order, count +} + func GetOrderListOutput(eg *xorm.Engine, param map[string]string) *[]model.Order { var order []model.Order sess := eg.Where("1=1") diff --git a/app/db/db_staff.go b/app/db/db_staff.go new file mode 100644 index 0000000..7108a00 --- /dev/null +++ b/app/db/db_staff.go @@ -0,0 +1,78 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils/logx" + "reflect" + "xorm.io/xorm" +) + +type StaffDb struct { + Db *xorm.Engine `json:"db"` +} + +func (staffDb *StaffDb) Set() { // set方法 + staffDb.Db = Db +} + +func (staffDb *StaffDb) GetStaff(id int) (m *model.Staff, err error) { + m = new(model.Staff) + has, err := staffDb.Db.Where("id =?", id).Get(m) + if err != nil { + return nil, logx.Error(err) + } + if has == false { + return nil, nil + } + return m, nil +} + +func (staffDb *StaffDb) FindStaff(limit, start int) (*[]model.Staff, error) { + var m []model.Staff + if limit == 0 || start == 0 { + if err := staffDb.Db.Desc("id").Find(&m); err != nil { + return nil, logx.Error(err) + } + } else { + if err := staffDb.Db.Desc("id").Limit(limit, start).Find(m); err != nil { + return nil, logx.Error(err) + } + } + return &m, nil +} + +func (staffDb *StaffDb) GetStaffByName(name string) (m *model.Staff, err error) { + m = new(model.Staff) + has, err := staffDb.Db.Where("name =?", name).Get(m) + if err != nil { + return nil, logx.Error(err) + } + if has == false { + return nil, nil + } + return m, nil +} + +func (staffDb *StaffDb) StaffInsert(m *model.Staff) (int, error) { + _, err := staffDb.Db.InsertOne(m) + if err != nil { + return 0, err + } + return m.Id, nil +} + +func (staffDb *StaffDb) StaffUpdate(m *model.Staff, columns ...string) (int64, error) { + affected, err := staffDb.Db.Where("id =?", m.Id).Cols(columns...).Update(m) + if err != nil { + return 0, err + } + return affected, nil +} + +func (staffDb *StaffDb) StaffDelete(id interface{}) (int64, error) { + if reflect.TypeOf(id).Kind() == reflect.Slice { + return Db.In("id", id).Delete(model.Staff{}) + } else { + return Db.Where("id = ?", id).Delete(model.Staff{}) + } +} diff --git a/app/db/model/staff.go b/app/db/model/staff.go new file mode 100644 index 0000000..8009280 --- /dev/null +++ b/app/db/model/staff.go @@ -0,0 +1,13 @@ +package model + +type Staff struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Name string `json:"name" xorm:"not null default '' comment('姓名') VARCHAR(255)"` + Sex int `json:"sex" xorm:"not null default 1 comment('性别(1:男 2:女)') TINYINT(1)"` + IdNo string `json:"id_no" xorm:"not null default '' comment('身份证号码') VARCHAR(255)"` + Phone string `json:"phone" xorm:"not null default '' comment('联系电话') CHAR(50)"` + NativePlace string `json:"native_place" xorm:"not null default '' comment('籍贯') CHAR(50)"` + Department string `json:"department" xorm:"not null default '' comment('部门') CHAR(50)"` + CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"` + UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"` +} diff --git a/app/ipad/lib/auth/base.go b/app/ipad/lib/auth/base.go index ff1c346..0d9c1e3 100644 --- a/app/ipad/lib/auth/base.go +++ b/app/ipad/lib/auth/base.go @@ -9,7 +9,7 @@ import ( // TokenExpireDuration is jwt 过期时间 const TokenExpireDuration = time.Hour * 4380 -var Secret = []byte("bakery_big_data") +var Secret = []byte("bakery_ipad") // JWTUser 如果想要保存更多信息,都可以添加到这个结构体中 type JWTUser struct { diff --git a/app/router/admin_router.go b/app/router/admin_router.go index c46ee1a..d1df9f5 100644 --- a/app/router/admin_router.go +++ b/app/router/admin_router.go @@ -78,8 +78,11 @@ func rSetCenter(r *gin.RouterGroup) { r.POST("/set", hdl.SetCenter) // 设置中心-设置 } -func rUser(r *gin.RouterGroup) { - +func rStaff(r *gin.RouterGroup) { + r.POST("/list", hdl.StaffList) + r.POST("/delete", hdl.StaffDelete) + r.POST("/add", hdl.StaffAdd) + r.POST("/update", hdl.StaffUpdate) } func rEnterprise(r *gin.RouterGroup) { @@ -142,8 +145,9 @@ func rOrder(r *gin.RouterGroup) { } func rFinanceManage(r *gin.RouterGroup) { - r.POST("/list", orderHdl.OrderList) //用户订单 - r.POST("/total", orderHdl.OrderTotal) //用户订单统计 + r.POST("/list", orderHdl.OrderList) //用户订单 + r.POST("/export", orderHdl.OrderExport) //用户订单导出 + r.POST("/total", orderHdl.OrderTotal) //用户订单统计 } func AdminRoute(r *gin.RouterGroup) { @@ -169,7 +173,7 @@ func AdminRoute(r *gin.RouterGroup) { rRole(r.Group("/role")) //权限管理 rSetCenter(r.Group("/setCenter")) //设置中心 - rUser(r.Group("/user")) //用户管理 + rStaff(r.Group("/staff")) //员工管理 rGoodsPay(r.Group("/goodsPay")) //商品下单 rOrder(r.Group("/order")) //用户订单 rFinanceManage(r.Group("/financeManage")) //财务管理