From 3032034d254fc15f06a1d4260f35c49f0ef1e12f Mon Sep 17 00:00:00 2001 From: yinbentan <yinbentan@live.com> Date: 星期五, 02 八月 2024 11:57:33 +0800 Subject: [PATCH] 添加接口,添加新的薪资查询和修改接口 --- controllers/salary_plan_controller.go | 399 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 396 insertions(+), 3 deletions(-) diff --git a/controllers/salary_plan_controller.go b/controllers/salary_plan_controller.go index 1aa74b4..17fa659 100644 --- a/controllers/salary_plan_controller.go +++ b/controllers/salary_plan_controller.go @@ -1,12 +1,17 @@ package controllers import ( + "fmt" "github.com/gin-gonic/gin" + "github.com/shopspring/decimal" + "gorm.io/gorm" + "silkserver/constvar" "silkserver/controllers/request" "silkserver/extend/code" "silkserver/extend/util" "silkserver/middleware" "silkserver/models" + "silkserver/pkg/structx" "silkserver/pkg/timex" "strconv" "time" @@ -20,7 +25,7 @@ // @Tags 鍛樺伐钖祫/钖叕鏂规 // @Summary 淇濆瓨钖叕鏂规 // @Produce application/json -// @Param object body models.SaveSalaryPlan true "鍙傛暟" +// @Param object body models.SalaryPlan true "鍙傛暟" // @Param Authorization header string true "token" // @Success 200 {object} util.Response "鎴愬姛" // @Router /api-jl/v1/salary/saveSalaryPlan [post] @@ -69,7 +74,7 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") return } - find, total, err := models.NewSalaryPlanSearch().SetPage(params.Page, params.PageSize).Find() + find, total, err := models.NewSalaryPlanSearch().SetPage(params.Page, params.PageSize).SetPreload(true).Find() if err != nil { util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") return @@ -82,7 +87,7 @@ // @Tags 鍛樺伐钖祫/钖叕鏂规 // @Summary 鍒犻櫎钖叕鏂规 // @Produce application/json -// @Param number path string true "id" +// @Param id path string true "id" // @Param Authorization header string true "token" // @Success 200 {object} util.Response "鎴愬姛" // @Router /api-jl/v1/salary/deleteSalaryPlanInfo/{id} [delete] @@ -104,3 +109,391 @@ } util.ResponseFormat(c, code.Success, "鍒犻櫎鎴愬姛") } + +// SaveSalaryType +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 淇濆瓨钖祫绫诲瀷 +// @Produce application/json +// @Param object body request.SalaryType true "鍙傛暟" +// @Param Authorization header string true "token" +// @Success 200 {object} util.Response "鎴愬姛" +// @Router /api-jl/v1/salary/saveSalaryType [post] +func (slf SalaryPlanController) SaveSalaryType(c *gin.Context) { + var params request.SalaryType + err := c.BindJSON(¶ms) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + if params.Type == 0 { + util.ResponseFormat(c, code.RequestParamError, "绫诲瀷涓嶈兘涓虹┖") + return + } + miniDicts, err := models.NewMiniDictSearch().SetType(params.Type).FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, err) + return + } + dicts := params.Values + add := make([]*models.MiniDict, 0) + del := make([]uint, 0) + update := make([]*models.MiniDict, 0) + for _, mini := range miniDicts { + flag := true + for i, value := range dicts { + var dict models.MiniDict + dict.Name = value.Name + dict.IsDefault = value.IsDefault + dict.Type = params.Type + if value.Id == 0 { + add = append(add, &dict) + flag = false + if i < len(dicts)-1 { + dicts = append(dicts[:i], dicts[i+1:]...) + } else { + dicts = dicts[:i] + } + break + } else if value.Id == mini.ID { + dict.ID = mini.ID + update = append(update, &dict) + flag = false + if i < len(dicts)-1 { + dicts = append(dicts[:i], dicts[i+1:]...) + } else { + dicts = dicts[:i] + } + break + } + } + if flag { + del = append(del, mini.ID) + } + } + //鏂板鐨� + for _, value := range dicts { + var dict models.MiniDict + dict.Name = value.Name + dict.IsDefault = value.IsDefault + dict.Type = params.Type + add = append(add, &dict) + } + + err = models.WithTransaction(func(db *gorm.DB) error { + if len(del) > 0 { + err = models.NewMiniDictSearch().SetOrm(db).SetIds(del).Delete() + if err != nil { + return err + } + } + if len(update) > 0 { + err = models.NewMiniDictSearch().SetOrm(db).SaveBatch(update) + if err != nil { + return err + } + } + if len(add) > 0 { + err = models.NewMiniDictSearch().SetOrm(db).CreateBatch(add) + if err != nil { + return err + } + } + + return nil + }) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触") + return + } + util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛") +} + +// GetSalaryTypeList +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 鑾峰彇钖祫绫诲瀷鍒楄〃 +// @Produce application/json +// @Param number path string true "type" "鍙傛暟" +// @Param Authorization header string true "token" +// @Success 200 {object} util.ResponseList{data=[]models.MiniDict} "鎴愬姛" +// @Router /api-jl/v1/salary/getSalaryTypeList/{type} [get] +func (slf SalaryPlanController) GetSalaryTypeList(c *gin.Context) { + tp := c.Param("type") + if tp == "" { + util.ResponseFormat(c, code.RequestParamError, "鏃犳晥鐨勭被鍨�") + return + } + atoi, _ := strconv.Atoi(tp) + if atoi == 0 { + util.ResponseFormat(c, code.RequestParamError, "鏃犳晥鐨勭被鍨�") + return + } + dicts, err := models.NewMiniDictSearch().SetType(constvar.MiniDictType(atoi)).FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ヨ澶辫触") + return + } + util.ResponseFormat(c, code.Success, dicts) +} + +// GetPayrollProductionCarList +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛� +// @Produce application/json +// @Param Authorization header string true "token" +// @Param object query request.PayrollProductionCar true "鏌ヨ鍙傛暟" +// @Success 200 {object} util.ResponseList{data=[]models.PayrollProductionCar} "鎴愬姛" +// @Router /api-jl/v1/salary/getPayrollProductionCarList [get] +func (slf SalaryPlanController) GetPayrollProductionCarList(c *gin.Context) { + var params request.PayrollProductionCar + if err := c.ShouldBindQuery(¶ms); err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + + carSearch := models.NewPayrollProductionCarSearch() + if len(params.Cycle) == 0 && len(params.Monthly) == 0 { + util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈�,蹇呴』杈撳叆鎸夊ぉ鏌ヨ鎴栨寜鏈堟煡璇€�傛牸寮忥細Cycle锛坹yyy-MM-dd锛� 鎴� Monthly锛坹yyy-MM锛�") + return + } + carSearch.SetPage(params.Page, params.PageSize) + carSearch.SetWorkshopNumber(params.WorkshopNumber).SetGroupNumber(params.GroupNumber).SetCarNumber(params.CarNumber).SetMarketNumber(params.MarketNumber).SetSpec(params.Spec) + list, total, err := carSearch.Find() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") + return + } + + util.ResponseFormatList(c, code.Success, list, total) +} + +// GetPayrollProductionGroupList +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 鑾峰彇灏忕粍姣忓ぉ鐨勪骇閲忓垪琛� +// @Produce application/json +// @Param Authorization header string true "token" +// @Param object query request.PayrollProductionGroup true "鏌ヨ鍙傛暟" +// @Success 200 {object} util.ResponseList{data=[]models.PayrollProductionGroup} "鎴愬姛" +// @Router /api-jl/v1/salary/getPayrollProductionGroupList [get] +func (slf SalaryPlanController) GetPayrollProductionGroupList(c *gin.Context) { + var params request.PayrollProductionGroup + if err := c.ShouldBindQuery(¶ms); err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + //params = request.PayrollProductionGroup{ + // Cycle: c.Query("cycle"), + // Monthly: c.Query("monthly"), + // WorkshopNumber: c.Query("workshopNumber"), + //} + //params.GroupNumber, _ = strconv.Atoi(c.Query("groupNumber")) + //params.Page, _ = strconv.Atoi(c.Query("page")) + //params.PageSize, _ = strconv.Atoi(c.Query("pageSize")) + + if len(params.Cycle) == 0 && len(params.Monthly) == 0 { + util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈�,蹇呴』杈撳叆鎸夊ぉ鏌ヨ鎴栨寜鏈堟煡璇€�傛牸寮忥細Cycle锛坹yyy-MM-dd锛� 鎴� Monthly锛坹yyy-MM锛�") + return + } + list, total, err := models.NewPayrollProductionGroupSearch().SetPage(params.Page, params.PageSize). + SetCycle(params.Cycle).SetMonthly(params.Monthly).SetWorkshopNumber(params.WorkshopNumber).SetGroupNumber(params.GroupNumber). + Find() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") + return + } + + util.ResponseFormatList(c, code.Success, list, total) +} + +// GetPayrollSalaryPlanList +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛� +// @Produce application/json +// @Param Authorization header string true "token" +// @Param object query request.PayrollSalaryPlan true "鏌ヨ鍙傛暟" +// @Success 200 {object} util.ResponseList{data=[]models.PayrollSalaryPlan} "鎴愬姛" +// @Router /api-jl/v1/salary/getPayrollSalaryPlanList [get] +func (slf SalaryPlanController) GetPayrollSalaryPlanList(c *gin.Context) { + var params request.PayrollSalaryPlan + if err := c.ShouldBindQuery(¶ms); err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + + if len(params.Cycle) == 0 { + util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈熴�傛牸寮忥細Cycle锛坹yyy-MM-dd锛�") + return + } + list, total, err := models.NewPayrollSalaryPlanSearch().SetPage(params.Page, params.PageSize). + SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetKeyword(params.Keyword).SetWorkTypeID(uint(params.WorkTypeID)).SetWorkTypeCode(constvar.JobType(params.WorkTypeCode)). + Find() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") + return + } + + util.ResponseFormatList(c, code.Success, list, total) +} + +// SavePayrollConstitute +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 钖叕鏁伴璋冩暣 +// @Produce application/json +// @Param object body request.SavePayrollConstitute true "鍙傛暟" +// @Param Authorization header string true "token" +// @Success 200 {object} util.Response "鎴愬姛" +// @Router /api-jl/v1/salary/savePayrollConstitute [post] +func (slf SalaryPlanController) SavePayrollConstitute(c *gin.Context) { + var params request.SavePayrollConstitute + var constitute models.PayrollConstitute + err := c.BindJSON(¶ms) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + err = structx.AssignTo(params, &constitute) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏁版嵁杞崲澶辫触") + return + } + if len(constitute.Cycle) < 7 { + util.ResponseFormat(c, code.RequestParamError, "鍛ㄦ湡鍙傛暟涓虹┖鎴栨牸寮忛敊璇�") + } + if len(constitute.WorkerID) == 0 { + util.ResponseFormat(c, code.RequestParamError, "鍛樺伐ID鍙傛暟涓虹┖") + } + if constitute.SalaryPlanId == 0 { + util.ResponseFormat(c, code.RequestParamError, "钖祫鏂规ID鍙傛暟涓虹┖") + } + + info := middleware.GetUserInfo(c) + if info == nil || info.NickName == "" { + util.ResponseFormat(c, code.RequestParamError, "鐢ㄦ埛鏈櫥褰�") + } + constitute.CreatedBy = info.NickName + + if payrollConstitute, err := models.NewPayrollConstituteSearch().SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetSalaryPlanId(params.SalaryPlanId).First(); err != nil && payrollConstitute != nil { + constitute.ID = payrollConstitute.ID + constitute.CreatedAt = payrollConstitute.CreatedAt + } + + if constitute.ID > 0 { + err = models.NewPayrollConstituteSearch().Save(&constitute) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触") + return + } + } else { + err = models.NewPayrollConstituteSearch().Create(&constitute) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触") + return + } + } + + util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛") +} + +// GetPayrollConstituteList +// +// @Tags 鍛樺伐钖祫/钖叕鏂规 +// @Summary 鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛� +// @Produce application/json +// @Param Authorization header string true "token" +// @Param object query request.PayrollConstitute true "鏌ヨ鍙傛暟" +// @Success 200 {object} util.ResponseList{data=map[string]interface{}} "鎴愬姛" +// @Router /api-jl/v1/salary/getPayrollConstituteList [get] +func (slf SalaryPlanController) GetPayrollConstituteList(c *gin.Context) { + + var params request.PayrollConstitute + if err := c.ShouldBindQuery(¶ms); err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + if len(params.Cycle) == 0 { + util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈熴�傛牸寮忥細Cycle锛坹yyy-MM-dd锛�") + return + } + + groupList, err := models.NewPayrollConstituteSearch().ConstituteGroup(&models.ConstituteGroup{Cycle: params.Cycle}) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘宸ヨ祫鍒嗙被澶辫触") + return + } + groupMap := make(map[string][]*models.ConstituteGroup, 0) + for _, group := range groupList { + if _, ok := groupMap[group.WorkerID]; ok { + groupMap[group.WorkerID] = append(groupMap[group.WorkerID], group) + } else { + groupMap[group.WorkerID] = []*models.ConstituteGroup{group} + } + } + + // 鍛樺伐淇℃伅 + workers, err := models.NewWorkerSearch().FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘鐢ㄦ埛澶辫触") + } + workerMap := make(map[string]*models.Worker) + for _, worker := range workers { + workerMap[worker.ID] = worker + } + + // 宸ヨ祫鏂规 + salaryPlans, err := models.NewSalaryPlanSearch().FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘钖祫鏂规澶辫触") + } + salaryPlanMap := make(map[uint]*models.SalaryPlan) + for _, plan := range salaryPlans { + salaryPlanMap[plan.ID] = plan + } + + // 宸ヨ祫鍗曢」 + constituteList, err := models.NewPayrollConstituteSearch().SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetWorkTypeID(uint(params.WorkTypeID)).SetWorkTypeCode(params.WorkTypeCode).FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘宸ヨ祫鍗曢」澶辫触") + return + } + constituteMap := make(map[string]*models.PayrollConstitute) + for _, v := range constituteList { + key := fmt.Sprintf("%v%v%v", v.Cycle, v.WorkerID, v.SalaryPlanId) + constituteMap[key] = v + } + + var list []map[string]interface{} + for workerId, group := range groupMap { + result := make(map[string]interface{}) + result["cycle"] = params.Cycle + if _, ok := workerMap[workerId]; ok { // 浜哄憳淇℃伅 + result["worker"] = workerMap[workerId] + } + amount := decimal.NewFromInt(0) + constituteList := make([]map[string]interface{}, 0) + for _, v := range group { + temp := make(map[string]interface{}) + if _, ok := salaryPlanMap[v.SalaryPlanId]; ok { + temp["salaryPlan"] = salaryPlanMap[v.SalaryPlanId] + } + + key := fmt.Sprintf("%v%v%v", v.Cycle, v.WorkerID, v.SalaryPlanId) + if _, ok := constituteMap[key]; ok { + temp["amount"] = constituteMap[key].Amount + amount = amount.Add(constituteMap[key].Amount) + } + constituteList = append(constituteList, temp) + } + result["amount"] = amount // 搴斿彂宸ヨ祫 + result["list"] = constituteList // 宸ヨ祫璇︽儏 + + list = append(list, result) + } + + util.ResponseFormat(c, code.Success, list) + +} -- Gitblit v1.8.0