Browse Source

Merge remote-tracking branch 'origin/dev' into dev

2545307760@qq.com 8 months ago
parent
commit
2ae4e1c85a

+ 2 - 0
server/api/v1/admin/enter.go

@@ -8,6 +8,7 @@ type ApiGroup struct {
 	FileApi
 	FinanceApi
 	ConstructorApi
+	ExpensesApi
 }
 
 var (
@@ -16,4 +17,5 @@ var (
 	fileService        = service.ServiceGroupApp.AdminServiceGroup.FileService
 	financeService     = service.ServiceGroupApp.AdminServiceGroup.FinanceService
 	constructorService = service.ServiceGroupApp.AdminServiceGroup.ConstructorService
+	expensesService    = service.ServiceGroupApp.AdminServiceGroup.ExpensesService
 )

+ 116 - 0
server/api/v1/admin/expenses.go

@@ -0,0 +1,116 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+)
+
+type ExpensesApi struct{}
+
+func (ea *ExpensesApi) QueryExpensesList(c *gin.Context) {
+	var info request.SearchExpenses
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryExpensesList ====== " + err.Error())
+		return
+	}
+	list, total, err := expensesService.QueryExpensesList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryExpensesList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (ea *ExpensesApi) QueryExpensesSumByPeople(c *gin.Context) {
+	var info request.SearchExpenses
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryExpensesSumByPeople ====== " + err.Error())
+		return
+	}
+	list, total, err := expensesService.QueryExpensesSumByPeople(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryExpensesSumByPeople ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (ea *ExpensesApi) QuerySurplus(c *gin.Context) {
+	surplus, err := expensesService.QuerySurplus()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QuerySurplus ====== " + err.Error())
+		return
+	}
+	response.OkWithData(surplus, c)
+}
+
+func (ea *ExpensesApi) CreateExpenses(c *gin.Context) {
+	var expenses dao.Expenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateExpense ====== " + err.Error())
+		return
+	}
+	err = expensesService.CreateExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateExpense ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (ea *ExpensesApi) UpdateExpenses(c *gin.Context) {
+	var expenses dao.Expenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateExpenses ====== " + err.Error())
+		return
+	}
+	err = expensesService.UpdateExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("修改成功", c)
+}
+
+func (ea *ExpensesApi) DeleteExpenses(c *gin.Context) {
+	var expenses dao.Expenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteExpenses ====== " + err.Error())
+		return
+	}
+	err = expensesService.DeleteExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("修改成功", c)
+}

+ 2 - 2
server/api/v1/admin/finance.go

@@ -13,7 +13,7 @@ import (
 type FinanceApi struct{}
 
 func (fa *FinanceApi) QueryDailyExpensesList(c *gin.Context) {
-	var info request.SearchProject
+	var info request.SearchDailyFee
 	err := c.ShouldBindJSON(&info)
 	if err != nil {
 		response.FailWithMessage("失败", c)
@@ -66,7 +66,7 @@ func (fa *FinanceApi) QueryExpensesGenre(c *gin.Context) {
 }
 
 func (fa *FinanceApi) QueryBorrowingList(c *gin.Context) {
-	var info request.SearchProject
+	var info request.SearchNameTime
 	err := c.ShouldBindJSON(&info)
 	if err != nil {
 		response.FailWithMessage("失败", c)

+ 8 - 5
server/api/v1/system/sys_user.go

@@ -1,6 +1,7 @@
 package system
 
 import (
+	"fmt"
 	"server/dao"
 	"strconv"
 	"time"
@@ -360,11 +361,12 @@ func (b *BaseApi) SetUserInfo(c *gin.Context) {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	err = utils.Verify(user, utils.IdVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
+	fmt.Println(user)
+	//err = utils.Verify(user, utils.IdVerify)
+	//if err != nil {
+	//	response.FailWithMessage(err.Error(), c)
+	//	return
+	//}
 
 	if user.AuthorityIds != 0 {
 		err = userService.SetUserAuthorities(user.ID, user.AuthorityIds)
@@ -384,6 +386,7 @@ func (b *BaseApi) SetUserInfo(c *gin.Context) {
 		Email:     user.Email,
 		SideMode:  user.SideMode,
 		Enable:    user.Enable,
+		OnePrice:  user.OnePrice,
 	})
 	if err != nil {
 		global.GVA_LOG.Error("设置失败!", zap.Error(err))

+ 5 - 2
server/dao/borrowing.go

@@ -22,7 +22,7 @@ func (Borrowing) TableName() string {
 // TODO:支借查询
 
 // QueryBorrowingList 查询支借列表
-func QueryBorrowingList(limit, offset int, name, time string) (borrowing []Borrowing, total int64, err error) {
+func QueryBorrowingList(limit, offset int, name, time, yearTime string) (borrowing []Borrowing, total int64, err error) {
 	// 创建db
 	db := global.GVA_DB.Model(&Borrowing{})
 	// 如果有条件搜索 下方会自动创建搜索语句
@@ -30,7 +30,10 @@ func QueryBorrowingList(limit, offset int, name, time string) (borrowing []Borro
 		db = db.Where("name LIKE ?", "%"+name+"%")
 	}
 	if time != "" {
-		db = db.Where("DATE_FORMAT(application_time, '%Y-%m-%d') = ?", time)
+		db = db.Where("DATE_FORMAT(application_time, '%Y-%m') = ?", time)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(application_time, '%Y') = ?", yearTime)
 	}
 	err = db.Count(&total).Error
 	if err != nil {

+ 7 - 3
server/dao/dailyExpenses.go

@@ -25,7 +25,7 @@ func (DailyExpenses) TableName() string {
 // TODO:日常费用查询
 
 // QueryDailyExpensesList 查询日常费用列表
-func QueryDailyExpensesList(limit, offset, genre int, name, time string) (dailyExpenses []DailyExpenses, total int64, err error) {
+func QueryDailyExpensesList(limit, offset, genre int, name, time, yearTime string) (dailyExpenses []DailyExpenses, total int64, err error) {
 	// 创建db
 	db := global.GVA_DB.Model(&DailyExpenses{})
 	// 如果有条件搜索 下方会自动创建搜索语句
@@ -36,7 +36,10 @@ func QueryDailyExpensesList(limit, offset, genre int, name, time string) (dailyE
 		db = db.Where("name LIKE ?", "%"+name+"%")
 	}
 	if time != "" {
-		db = db.Where("DATE_FORMAT(application_time, '%Y-%m-%d') = ?", time)
+		db = db.Where("DATE_FORMAT(application_time, '%Y-%m') = ?", time)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(application_time, '%Y') = ?", yearTime)
 	}
 	err = db.Count(&total).Error
 	if err != nil {
@@ -87,7 +90,8 @@ func (de DailyExpenses) UpdateDailyExpenses() error {
 			return txErr
 		}
 		for _, dailyFeeDetail := range de.DailyFeeDetails {
-			txErr := tx.Create(&dailyFeeDetail).Error
+			dailyFeeDetail.DailyFeeId = de.ID
+			txErr := tx.Model(&DailyFeeDetails{}).Create(&dailyFeeDetail).Error
 			if txErr != nil {
 				return txErr
 			}

+ 5 - 0
server/dao/department.go

@@ -36,6 +36,11 @@ func QueryUsersByDepId(depId int) (users []SysUser, err error) {
 	return users, err
 }
 
+func QueryDepById(id int) (dep Department, err error) {
+	err = global.GVA_DB.Model(&Department{}).Where("id = ?", id).First(&dep).Error
+	return dep, err
+}
+
 // TODO:部门新增
 
 // CreateDep 创建部门

+ 118 - 0
server/dao/expenses.go

@@ -0,0 +1,118 @@
+package dao
+
+import "server/global"
+
+type Expenses struct {
+	global.GVA_MODEL
+	Reimburser        int           `json:"reimburser" form:"reimburser" gorm:"comment:报销人"`
+	SysUser           SysUser       `json:"user" form:"user" gorm:"foreignKey:Reimburser;references:id;"`
+	DepartmentId      int           `json:"departmentId" form:"departmentId" gorm:"comment:部门id"`
+	Department        Department    `json:"department" form:"department" gorm:"foreignKey:DepartmentId;references:id;"`
+	ExpenditureAmount float64       `json:"expenditureAmount" form:"expenditureAmount" gorm:"comment:支出金额;type:double(10,2)"`
+	DepositAmount     float64       `json:"depositAmount" form:"depositAmount" gorm:"comment:支入金额;type:double(10,2)"`
+	FeeTime           string        `json:"feeTime" form:"feeTime" gorm:"comment:时间"`
+	Genre             int           `json:"genre" form:"genre" gorm:"comment:费用类型id"`
+	ExpensesGenre     ExpensesGenre `json:"expensesGenre" form:"expensesGenre" gorm:"foreignKey:Genre;references:id;"`
+	ProjectId         int           `json:"projectId" form:"projectId" gorm:"comment:项目id"`
+	Project           Project       `json:"project" form:"project" gorm:"foreignKey:ProjectId;references:id"`
+	ExpenseDetail     string        `json:"expenseDetail" form:"expenseDetail" gorm:"comment:费用明细"`
+	Remarks           string        `json:"remarks" form:"remarks" gorm:"comment:备注"`
+	ThenBalance       float64       `json:"thenBalance" form:"thenBalance" gorm:"comment:当时余额;type:double(10,2)"`
+}
+
+type ExpensesResult struct {
+	Reimburser           int     `json:"reimburser" form:"reimburser" gorm:"comment:报销人"`
+	SysUser              SysUser `json:"user" form:"user" gorm:"foreignKey:Reimburser;references:id;"`
+	ExpenditureAmountSum float64
+	DepositAmountSum     float64
+	DepartmentId         int        `json:"departmentId" form:"departmentId" gorm:"comment:部门id"`
+	Department           Department `json:"department" form:"department" gorm:"foreignKey:DepartmentId;references:id;"`
+	Expenses             []Expenses `json:"expenses" form:"expenses" gorm:"-"`
+}
+
+func (Expenses) TableName() string {
+	return "expenses"
+}
+
+func QueryExpensesList(limit, offset, genre, projectId, name int, dayTime, monthTime, yearTime string) (expenses []Expenses, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Expenses{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if projectId != 0 {
+		db = db.Where("project_id = ?", projectId)
+	}
+	if name != 0 {
+		db = db.Where("reimburser = ?", name)
+	}
+	if dayTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y-%m-%d') = ?", dayTime)
+	}
+	if monthTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y-%m') = ?", monthTime)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y') = ?", yearTime)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("SysUser").Preload("Department").Preload("ExpensesGenre").Preload("Project").Find(&expenses).Error
+	return expenses, total, err
+}
+
+func QueryExpensesSumByPeople(limit, offset, genre, projectId, name int, dayTime, monthTime, yearTime string) (results []ExpensesResult, total int64, err error) {
+	db := global.GVA_DB.Model(&Expenses{}).Select("reimburser,SUM(expenditure_amount) as expenditure_amount_sum,SUM(deposit_amount) as deposit_amount_sum,department_id")
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if projectId != 0 {
+		db = db.Where("project_id = ?", projectId)
+	}
+	if name != 0 {
+		db = db.Where("reimburser = ?", name)
+	}
+	if dayTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y-%m-%d') = ?", dayTime)
+	}
+	if monthTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y-%m') = ?", monthTime)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(fee_time, '%Y') = ?", yearTime)
+	}
+	err = db.Group("reimburser,department_id").Limit(limit).Offset(offset).Preload("SysUser").Preload("Department").Count(&total).Scan(&results).Error
+
+	return
+}
+
+func QuerySurplus() (interface{}, error) {
+	type Result struct {
+		FeeTime              string
+		ExpenditureAmountSum float64
+		DepositAmountSum     float64
+		Surplus              float64
+	}
+
+	var results []Result
+	db := global.GVA_DB.Model(&Expenses{}).Select("DATE_FORMAT(fee_time, '%Y-%m') AS fee_time, SUM(expenditure_amount) AS expenditure_amount_sum,SUM(deposit_amount) AS deposit_amount_sum,(SUM(deposit_amount) - SUM(expenditure_amount)) AS surplus")
+
+	err := db.Group("DATE_FORMAT(fee_time, '%Y-%m')").Scan(&results).Error
+	return results, err
+}
+
+func (e Expenses) CreateExpenses() error {
+	return global.GVA_DB.Create(&e).Error
+}
+
+func (e Expenses) UpdateExpenses() error {
+	return global.GVA_DB.Model(&Expenses{}).Updates(&e).Error
+}
+
+func (e Expenses) DeleteExpenses() error {
+	return global.GVA_DB.Unscoped().Where("id = ?", e.ID).Delete(&e).Error
+}

+ 11 - 11
server/dao/projectWorkingHours.go

@@ -6,11 +6,11 @@ import (
 
 type ProjectWorkingHours struct {
 	global.GVA_MODEL
-	ProjectCode string      `json:"projectCode" form:"projectCode" gorm:"comment:项目编号"`
-	People      int         `json:"people" form:"people" gorm:"comment:报工人"`
-	Constructor Constructor `json:"constructor" form:"constructor" gorm:"foreignKey:People;references:id;"`
-	Days        float64     `json:"days" form:"days" gorm:"type:double(5,1);not null;comment:天数"`
-	PeopleTime  string      `json:"peopleTime" form:"peopleTime" gorm:"comment:报工时间"`
+	ProjectCode string  `json:"projectCode" form:"projectCode" gorm:"comment:项目编号"`
+	People      int     `json:"people" form:"people" gorm:"comment:报工人"`
+	SysUser     SysUser `json:"constructor" form:"constructor" gorm:"foreignKey:People;references:id;"`
+	Days        float64 `json:"days" form:"days" gorm:"type:double(5,1);not null;comment:天数"`
+	PeopleTime  string  `json:"peopleTime" form:"peopleTime" gorm:"comment:报工时间"`
 }
 
 func (ProjectWorkingHours) TableName() string {
@@ -40,7 +40,7 @@ func QueryWorkingHoursList(limit, offset, people int, code, time, yearTime strin
 	if err != nil {
 		return
 	}
-	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("Constructor").Find(&projectWorkingHours).Error
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("SysUser").Find(&projectWorkingHours).Error
 	return projectWorkingHours, total, err
 }
 
@@ -53,8 +53,8 @@ func QueryWorkingHoursSum(limit, offset, people int, code, time, yearTime string
 	}
 
 	var results []Result
-	db := global.GVA_DB.Model(&ProjectWorkingHours{}).Select("people,constructor.`name`,SUM(days) as sum_day,(SUM(days) * one_price) as price_sum").
-		Joins("JOIN constructor ON project_working_hours.people = constructor.id")
+	db := global.GVA_DB.Model(&ProjectWorkingHours{}).Select("people,sys_users.`nick_name` as name,SUM(days) as sum_day,(SUM(days) * one_price) as price_sum").
+		Joins("JOIN sys_users ON project_working_hours.people = sys_users.id")
 
 	// 如果有条件搜索 下方会自动创建搜索语句
 	if code != "" {
@@ -69,19 +69,19 @@ func QueryWorkingHoursSum(limit, offset, people int, code, time, yearTime string
 	if yearTime != "" {
 		db = db.Where("DATE_FORMAT(people_time, '%Y') = ?", yearTime)
 	}
-	err = db.Group("people").Limit(limit).Offset(offset).Preload("Constructor").Count(&total).Scan(&results).Error
+	err = db.Group("people").Limit(limit).Offset(offset).Preload("SysUser").Count(&total).Scan(&results).Error
 	return results, total, err
 }
 
 // QueryWorkingHours 查询工时
 func QueryWorkingHours(code string) (workingHours []ProjectWorkingHours, err error) {
-	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("project_code = ?", code).Preload("Constructor").Find(&workingHours).Error
+	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("project_code = ?", code).Preload("SysUser").Find(&workingHours).Error
 	return workingHours, err
 }
 
 // QueryWorkingHoursByCode 查询单个工时 按id
 func QueryWorkingHoursByCode(code string, people int) (workingHours ProjectWorkingHours, err error) {
-	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("code = ? and people = ?", code, people).Preload("Constructor").First(&workingHours).Error
+	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("code = ? and people = ?", code, people).Preload("SysUser").First(&workingHours).Error
 	return workingHours, err
 }
 

+ 3 - 2
server/dao/sys_user.go

@@ -22,7 +22,8 @@ type SysUser struct {
 	Phone        string       `json:"phone"  gorm:"comment:用户手机号"`                     // 用户手机号
 	Email        string       `json:"email"  gorm:"comment:用户邮箱"`                      // 用户邮箱
 	Enable       int          `json:"enable" gorm:"default:1;comment:用户是否被冻结 1正常 2冻结"` //用户是否被冻结 1正常 2冻结
-	DepartmentId int          `json:"departmentId" gorm:"comment:部门id"`
+	DepartmentId int          `json:"departmentId" form:"departmentId" gorm:"comment:部门id"`
+	OnePrice     float64      `json:"onePrice" form:"onePrice" gorm:"comment:人天单价"`
 }
 
 func (SysUser) TableName() string {
@@ -136,7 +137,7 @@ func SetUserAuthorities(id uint, authorityId uint) (err error) {
 
 // SetUserInfo 修改用户信息
 func (u SysUser) SetUserInfo() error {
-	return global.GVA_DB.Model(&SysUser{}).Updates(&u).Error
+	return global.GVA_DB.Model(&SysUser{}).Where("id = ?", u.ID).Updates(&u).Error
 }
 
 // SetUserInfoById 修改用户信息 按id

+ 1 - 0
server/initialize/gorm.go

@@ -61,6 +61,7 @@ func RegisterTables() {
 		dao.Reimbursement{},
 		dao.FeeDetails{},
 		dao.Constructor{},
+		dao.Expenses{},
 	)
 	if err != nil {
 		global.GVA_LOG.Error("register table failed", zap.Error(err))

+ 1 - 0
server/initialize/router.go

@@ -92,6 +92,7 @@ func Routers() *gin.Engine {
 		adminRouter.InitFileRouter(PrivateGroup)
 		adminRouter.InitFinanceRouter(PrivateGroup)
 		adminRouter.InitConstructorRouter(PrivateGroup)
+		adminRouter.InitExpensesRouter(PrivateGroup)
 	}
 
 	global.GVA_LOG.Info("router register success")

+ 25 - 0
server/model/common/request/common.go

@@ -45,6 +45,31 @@ type SearchWorkingHours struct {
 	People   int      `json:"people" form:"people"`
 }
 
+type SearchDailyFee struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Name     string   `json:"name" form:"name"`
+	Time     string   `json:"time" form:"time"`
+	YearTime string   `json:"yearTime" form:"yearTime"`
+	Genre    int      `json:"genre" form:"genre"`
+}
+
+type SearchNameTime struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Name     string   `json:"name" form:"name"`
+	Time     string   `json:"time" form:"time"`
+	YearTime string   `json:"yearTime" form:"yearTime"`
+}
+
+type SearchExpenses struct {
+	PageInfo   PageInfo `json:"pageInfo" form:"pageInfo"`
+	Reimburser int      `json:"reimburser" form:"reimburser"`
+	ProjectId  int      `json:"projectId" form:"projectId"`
+	Genre      int      `json:"genre" form:"genre"`
+	DayTime    string   `json:"dayTime" form:"dayTime"`
+	MonthTime  string   `json:"monthTime" form:"monthTime"`
+	YearTime   string   `json:"yearTime" form:"yearTime"`
+}
+
 type SearchProjectList struct {
 	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
 	Code     string   `json:"code" form:"code"`

+ 1 - 0
server/model/system/request/sys_user.go

@@ -52,4 +52,5 @@ type ChangeUserInfo struct {
 	SideMode     string             `json:"sideMode"  gorm:"comment:用户侧边主题"`                                                      // 用户侧边主题
 	Enable       int                `json:"enable" gorm:"comment:冻结用户"`                                                           //冻结用户
 	Authorities  []dao.SysAuthority `json:"-" gorm:"many2many:sys_user_authority;"`
+	OnePrice     float64            `json:"onePrice" form:"onePrice" gorm:"comment:人天单价"`
 }

+ 1 - 0
server/router/admin/enter.go

@@ -6,4 +6,5 @@ type RouterGroup struct {
 	ConstructorRouter
 	FileRouter
 	FinanceRouter
+	ExpensesRouter
 }

+ 26 - 0
server/router/admin/expenses.go

@@ -0,0 +1,26 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "server/api/v1"
+	"server/middleware"
+)
+
+type ExpensesRouter struct{}
+
+func (s *DepartmentRouter) InitExpensesRouter(Router *gin.RouterGroup) {
+	expensesRouter := Router.Group("expenses").Use(middleware.OperationRecord())
+	expensesRouterWithoutRecord := Router.Group("expenses")
+
+	expensesApi := v1.ApiGroupApp.AdminApiGroup.ExpensesApi
+	{
+		expensesRouter.POST("createExpenses", expensesApi.CreateExpenses)
+		expensesRouter.PUT("updateExpenses", expensesApi.UpdateExpenses)
+		expensesRouter.DELETE("deleteExpenses", expensesApi.DeleteExpenses)
+	}
+	{
+		expensesRouterWithoutRecord.POST("queryExpensesList", expensesApi.QueryExpensesList)
+		expensesRouterWithoutRecord.POST("queryExpensesSumByPeople", expensesApi.QueryExpensesSumByPeople)
+		expensesRouterWithoutRecord.GET("querySurplus", expensesApi.QuerySurplus)
+	}
+}

+ 1 - 0
server/service/admin/enter.go

@@ -6,4 +6,5 @@ type ServiceGroup struct {
 	FileService
 	FinanceService
 	ConstructorService
+	ExpensesService
 }

+ 55 - 0
server/service/admin/expenses.go

@@ -0,0 +1,55 @@
+package admin
+
+import (
+	"server/dao"
+	"server/model/common/request"
+)
+
+type ExpensesService struct{}
+
+func (es *ExpensesService) QueryExpensesList(info request.SearchExpenses) ([]dao.Expenses, int64, error) {
+	limit := info.PageInfo.PageSize
+	offset := info.PageInfo.PageSize * (info.PageInfo.Page - 1)
+	return dao.QueryExpensesList(limit, offset, info.Genre, info.ProjectId, info.Reimburser, info.DayTime, info.MonthTime, info.YearTime)
+}
+
+func (es *ExpensesService) QueryExpensesSumByPeople(info request.SearchExpenses) ([]dao.ExpensesResult, int64, error) {
+	limit := info.PageInfo.PageSize
+	offset := info.PageInfo.PageSize * (info.PageInfo.Page - 1)
+	expenses, total, err := dao.QueryExpensesSumByPeople(limit, offset, info.Genre, info.ProjectId, info.Reimburser, info.DayTime, info.MonthTime, info.YearTime)
+	for i, expens := range expenses {
+		list, _, err := dao.QueryExpensesList(1000, 0, info.Genre, info.ProjectId, expens.Reimburser, info.DayTime, info.MonthTime, info.YearTime)
+		if err != nil {
+			return expenses, total, err
+		}
+		deps, err := dao.QueryDepById(expens.DepartmentId)
+		if err != nil {
+			return expenses, total, err
+		}
+		user, err := dao.QueryUserByUserId(uint(expens.Reimburser))
+		if err != nil {
+			return expenses, total, err
+		}
+		expenses[i].Expenses = list
+		expenses[i].Department = deps
+		expenses[i].SysUser = user
+	}
+
+	return expenses, total, err
+}
+
+func (es *ExpensesService) QuerySurplus() (interface{}, error) {
+	return dao.QuerySurplus()
+}
+
+func (es *ExpensesService) CreateExpenses(expenses dao.Expenses) error {
+	return expenses.CreateExpenses()
+}
+
+func (es *ExpensesService) UpdateExpenses(expenses dao.Expenses) error {
+	return expenses.UpdateExpenses()
+}
+
+func (es *ExpensesService) DeleteExpenses(expenses dao.Expenses) error {
+	return expenses.DeleteExpenses()
+}

+ 4 - 4
server/service/admin/finance.go

@@ -7,10 +7,10 @@ import (
 
 type FinanceService struct{}
 
-func (fs *FinanceService) QueryDailyExpensesList(info request.SearchProject) (list interface{}, total int64, err error) {
+func (fs *FinanceService) QueryDailyExpensesList(info request.SearchDailyFee) (list interface{}, total int64, err error) {
 	limit := info.PageInfo.PageSize
 	offset := info.PageInfo.PageSize * (info.PageInfo.Page - 1)
-	dailyExpenses, total, err := dao.QueryDailyExpensesList(limit, offset, info.State, info.Name, info.Time)
+	dailyExpenses, total, err := dao.QueryDailyExpensesList(limit, offset, info.Genre, info.Name, info.Time, info.YearTime)
 
 	for i, expenses := range dailyExpenses {
 		feeDetails, err := dao.QueryDailyFeeDetails(int(expenses.ID))
@@ -40,10 +40,10 @@ func (fs *FinanceService) QueryExpensesGenre() ([]dao.ExpensesGenre, error) {
 	return dao.QueryExpensesGenre()
 }
 
-func (fs *FinanceService) QueryBorrowingList(info request.SearchProject) (list interface{}, total int64, err error) {
+func (fs *FinanceService) QueryBorrowingList(info request.SearchNameTime) (list interface{}, total int64, err error) {
 	limit := info.PageInfo.PageSize
 	offset := info.PageInfo.PageSize * (info.PageInfo.Page - 1)
-	borrowing, total, err := dao.QueryBorrowingList(limit, offset, info.Name, info.Time)
+	borrowing, total, err := dao.QueryBorrowingList(limit, offset, info.Name, info.Time, info.YearTime)
 	return borrowing, total, err
 }
 

+ 1 - 0
server/service/system/sys_user.go

@@ -29,6 +29,7 @@ func (userService *UserService) Register(u dao.SysUser) (userInter dao.SysUser,
 	// 否则 附加uuid 密码hash加密 注册
 	u.Password = utils.BcryptHash(u.Password)
 	u.UUID = uuid.Must(uuid.NewV4())
+	u.DepartmentId = 1
 	err = u.CreateUser()
 	return u, err
 }

+ 7 - 0
web/src/api/cost.js

@@ -8,6 +8,13 @@ export const queryCostList = (data) => {
   })
 }
 
+export const querySurplus = () => {
+  return service({
+    url: '/expenses/querySurplus',
+    method: 'get',
+  })
+}
+
 // 新增费用
 export const createCost = (data) => {
   return service({

+ 66 - 56
web/src/view/dashboard/dashboardCharts/echartsLine.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="dashboard-line-box">
     <div class="dashboard-line-title">
-      访问趋势
+      公司费用
     </div>
     <div
       ref="echart"
@@ -13,31 +13,25 @@
 import * as echarts from 'echarts'
 import { nextTick, onMounted, onUnmounted, ref } from 'vue'
 import { useWindowResize } from '@/hooks/use-windows-resize'
-var dataAxis = []
-for (var i = 1; i < 13; i++) {
-  dataAxis.push(`${i}月`)
-}
-var data = [
-  220,
-  182,
-  191,
-  234,
-  290,
-  330,
-  310,
-  123,
-  442,
-  321,
-  90,
-  149,
-]
-var yMax = 500
-var dataShadow = []
+import { querySurplus } from '@/api/cost'
 
-for (let i = 0; i < data.length; i++) {
-  dataShadow.push(yMax)
+const queryData = async() => {
+  await querySurplus().then(res => {
+    console.log(res.data)
+    for (let i = 0; i < res.data.length; i++) {
+      dataAxis.push(res.data[i].FeeTime)
+      expenditureData.push(res.data[i].ExpenditureAmountSum)
+      depositData.push(res.data[i].DepositAmountSum)
+      surplusData.push(res.data[i].Surplus)
+    }
+  })
 }
 
+var dataAxis = []
+var expenditureData = []
+var depositData = []
+var surplusData = []
+
 let chart = null
 const echart = ref(null)
 
@@ -57,54 +51,69 @@ const initChart = () => {
 }
 const setOptions = () => {
   chart.setOption({
+    legend: {
+      data: ['支出', '支入', '盈余']
+    },
     grid: {
-      left: '40',
-      right: '20',
-      top: '40',
-      bottom: '20',
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
     },
     xAxis: {
+      type: 'category',
+      boundaryGap: false,
       data: dataAxis,
-      axisTick: {
-        show: false,
-      },
-      axisLine: {
-        show: false,
-      },
-      z: 10,
     },
     yAxis: {
-      axisLine: {
-        show: false,
-      },
-      axisTick: {
-        show: false,
-      },
-      axisLabel: {
-        textStyle: {
-          color: '#999',
-        },
+      type: 'value'
+    },
+    toolbox: {
+      feature: {
+        saveAsImage: {}
+      }
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'cross',
+        label: {
+          backgroundColor: '#6a7985'
+        }
       },
     },
     dataZoom: [
       {
         type: 'inside',
+        start: 0,
+        end: 100
       },
+      {
+        start: 0,
+        end: 100
+      }
     ],
     series: [
       {
-        type: 'bar',
-        barWidth: '40%',
-        itemStyle: {
-          borderRadius: [5, 5, 0, 0],
-          color: '#188df0',
-        },
-        emphasis: {
-          itemStyle: {
-            color: '#188df0',
-          },
-        },
-        data: data,
+        name: '支出',
+        type: 'line',
+        stack: 'Total',
+        data: expenditureData,
+        smooth: true,
+      },
+      {
+        name: '支入',
+        type: 'line',
+        stack: 'Total',
+        data: depositData,
+        smooth: true,
+      },
+      {
+        name: '盈余',
+        type: 'line',
+        stack: 'Total',
+        data: surplusData,
+        smooth: true,
       },
     ],
   })
@@ -112,6 +121,7 @@ const setOptions = () => {
 
 onMounted(async() => {
   await nextTick()
+  await queryData()
   initChart()
 })
 

+ 8 - 3
web/src/view/dashboard/dashboardTable/dashboardTable.vue

@@ -38,7 +38,11 @@
           prop="collectionTime"
           label="完成日期"
           align="center"
-        />
+        >
+          <template #default="scope">
+            {{ dayjs(scope.row.collectionTime).format('YYYY-MM-DD') }}
+          </template>
+        </el-table-column>
       </el-table>
     </div>
   </div>
@@ -47,6 +51,7 @@
 <script setup>
 import { onMounted, reactive, ref } from 'vue'
 import { getProjectList } from '@/api/project'
+import { dayjs } from 'element-plus'
 
 const projectList = ref()
 
@@ -71,7 +76,7 @@ const already = (val) => {
   console.log(val.collection)
   let sum = 0
   for (const key in val.collection) {
-    sum = sum + Number(val.collection[key].price)
+    sum = sum + Number(val.collection[key].collectionPrice)
   }
   return sum
 }
@@ -79,7 +84,7 @@ const already = (val) => {
 const isTo = (val) => {
   let sum = 0
   for (const key in val.collection) {
-    sum = sum + Number(val.collection[key].price)
+    sum = sum + Number(val.collection[key].collectionPrice)
   }
   return Number(val.price) - sum
 }

+ 3 - 3
web/src/view/dashboard/index.vue

@@ -18,16 +18,16 @@
       <div class="gva-card">
         <div class="gva-card-title">数据统计</div>
         <div class="p-4">
-          <el-row :gutter="20">
+          <el-row :gutter="10">
             <el-col
               :xs="24"
-              :sm="14"
+              :sm="13"
             >
               <echarts-line />
             </el-col>
             <el-col
               :xs="24"
-              :sm="10"
+              :sm="11"
             >
               <dashboard-table />
             </el-col>

+ 17 - 3
web/src/view/department/department.vue

@@ -302,6 +302,7 @@ const handleSwitchChange = async(row) => {
   await updateDepStatus(row).then(res => {
     if (res.code === 0) {
       ElMessage.success('更新成功')
+      queryData()
     }
   })
 }
@@ -325,7 +326,10 @@ const handleEditDep = (row) => {
 
 const handleUpdateDep = async() => {
   await updateDep(updateDepFromData.value).then(res => {
-    console.log(res)
+    if (res.code === 0) {
+      ElMessage.success('更新成功')
+      queryData()
+    }
   })
   updateDialogVisible.value = false
 }
@@ -343,6 +347,12 @@ const handleDeleteDep = (row) => {
     .then(async() => {
       await deleteDep(row.ID).then(res => {
         console.log(res)
+        if (res.code === 0) {
+          ElMessage.success('删除成功')
+          queryData()
+        } else if (res.msg === '当前部门下存在用户') {
+          ElMessage.error('当前部门下存在用户')
+        }
       })
       await queryData()
     })
@@ -385,7 +395,9 @@ const distributionDep = async() => {
     return false
   }
   await updateUserDep(distributionDepData.value).then(res => {
-    console.log(res)
+    if (res.code === 0) {
+      ElMessage.success('更新成功')
+    }
   })
   await queryData()
   distributionDialogVisible.value = false
@@ -407,7 +419,9 @@ const handleAddDep = async() => {
     return false
   }
   await createDep(depFromData.value).then(res => {
-    console.log(res)
+    if (res.code === 0) {
+      ElMessage.success('新增成功')
+    }
   })
   await queryData()
   centerDialogVisible.value = false

+ 5 - 5
web/src/view/finance/borrowing/borrowing.vue

@@ -519,7 +519,7 @@ const searchDailyExpenses = reactive({
   name: '',
   time: '',
   yearTime: '',
-  state: null
+  genre: null
 })
 // 分页
 const dailyExpensesSizeChange = (val) => {
@@ -555,19 +555,18 @@ const borrowingCurrentChange = (val) => {
 }
 
 const queryData = async() => {
-  if (searchDailyExpenses.state === '') {
-    searchDailyExpenses.state = null
+  if (searchDailyExpenses.genre === '') {
+    searchDailyExpenses.genre = null
   }
   // 查询类型
   await queryExpensesGenre().then(res => {
-    // console.log('查询1:', res.data)
     feeGenre.value = res.data
   })
   // 查询用户列表
   await getAllUsers().then(res => {
-    // console.log('查询2:', res.data)
     users.value = res.data
   })
+  console.log(searchDailyExpenses)
   // 日常费用列表
   await queryDailyExpensesList(searchDailyExpenses).then(res => {
     const list = res.data.list
@@ -665,6 +664,7 @@ const sumExpenses = () => {
 const saveDailyExpenses = async() => {
   for (let i = 0; i < dailyExpensesData.value.dailyFeeDetails.length; i++) {
     dailyExpensesData.value.dailyFeeDetails[i].id = null
+    dailyExpensesData.value.dailyFeeDetails[i].ID = null
   }
   const dd = dailyExpensesData.value
   // 校验

+ 8 - 174
web/src/view/finance/workingHours/workingHours.vue

@@ -34,7 +34,7 @@
                 <el-option
                   v-for="item in constructorOptions"
                   :key="item.ID"
-                  :label="item.name"
+                  :label="item.nickName"
                   :value="item.ID"
                 />
               </el-select>
@@ -53,9 +53,6 @@
           </el-button>
           <template #dropdown>
             <el-dropdown-menu>
-              <el-dropdown-item @click="openConstructor = true">
-                施工人员
-              </el-dropdown-item>
               <el-dropdown-item @click="listSwitching(1)">
                 详情列表
               </el-dropdown-item>
@@ -75,7 +72,7 @@
             label="项目编号"
           />
           <el-table-column
-            prop="constructor.name"
+            prop="constructor.nickName"
             label="姓名"
           />
           <el-table-column
@@ -127,101 +124,10 @@
           @size-change="handleSizeChange"
         />
       </div>
-      <el-dialog
-        v-model="openConstructor"
-        title="施工人员"
-        width="800"
-        align-center
-      >
-        <el-collapse v-model="activeNames">
-          <el-collapse-item
-            title="操作"
-            name="1"
-          >
-            <el-form>
-              <el-form-item label="施工人员">
-                <el-input
-                  v-model="constructorData.name"
-                  style="width: 400px"
-                >
-                  <template #prepend>
-                    <el-select
-                      v-model="constructorData.id"
-                      placeholder="查询"
-                      style="width: 115px"
-                      clearable
-                      filterable
-                      @change="changeConstructor"
-                    >
-                      <el-option
-                        v-for="item in constructorOptions"
-                        :key="item.ID"
-                        :label="item.name"
-                        :value="item.ID"
-                      />
-                    </el-select>
-                  </template>
-                  <template #append>
-                    <el-button @click="erasureConstructor">删除</el-button>
-                  </template>
-                </el-input>
-              </el-form-item>
-              <el-form-item label="人天单价">
-                <el-input
-                  v-model="constructorData.onePrice"
-                  style="width: 400px"
-                />
-              </el-form-item>
-              <el-form-item>
-                <el-button @click="saveConstructor">保存</el-button>
-              </el-form-item>
-            </el-form>
-          </el-collapse-item>
-          <el-collapse-item
-            title="列表"
-            name="2"
-          >
-            <div>
-              <el-table :data="constructorTableData">
-                <el-table-column
-                  prop="name"
-                  label="姓名"
-                />
-                <el-table-column
-                  prop="onePrice"
-                  label="人天单价"
-                />
-              </el-table>
-              <div class="gva-pagination">
-                <el-pagination
-                  :current-page="searchData.pageInfo.page"
-                  :page-size="searchData.pageInfo.pageSize"
-                  :page-sizes="[10, 30, 50, 100]"
-                  :total="total"
-                  layout="total, sizes, prev, pager, next, jumper"
-                  @current-change="handleCurrentChange"
-                  @size-change="handleSizeChange"
-                />
-              </div>
-            </div>
-          </el-collapse-item>
-        </el-collapse>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="openConstructor = false">取消</el-button>
-            <el-button
-              type="primary"
-              @click="openConstructor = false"
-            >
-              确定
-            </el-button>
-          </div>
-        </template>
-      </el-dialog>
       <!--      修改-->
       <el-dialog
         v-model="workingDialog"
-        title="修改工时"
+        title="Warning"
         width="500"
         align-center
       >
@@ -235,7 +141,7 @@
             </el-form-item>
             <el-form-item label="人员">
               <el-input
-                v-model="workingHoursData.constructor.name"
+                v-model="workingHoursData.constructor.nickName"
                 disabled
               />
             </el-form-item>
@@ -266,25 +172,16 @@
 <script setup>
 import { ref, onMounted } from 'vue'
 import {
-  createConstructor,
-  deleteConstructor, deleteWorkingHours,
-  queryConstructor,
+  deleteWorkingHours,
   queryConstructorList, queryWorkingHoursList, queryWorkingHoursSum,
-  updateConstructor, updateWorkingHours
+  updateWorkingHours
 } from '@/api/finance'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { getAllUsers } from '@/api/user'
 
 // 施工人员----------------------------------------------------------------
 
-const activeNames = ref(['1'])
-const openConstructor = ref(false)
-
 const constructorOptions = ref()
-const constructorData = ref({
-  id: null,
-  name: '',
-  onePrice: null,
-})
 
 const searchData = ref({
   pageInfo: {
@@ -327,7 +224,7 @@ const workingHoursList = ref()
 const workingHoursSum = ref()
 
 const queryData = async() => {
-  await queryConstructor().then(res => {
+  await getAllUsers().then(res => {
     constructorOptions.value = res.data
   })
   await queryConstructorList(searchData.value).then(res => {
@@ -367,69 +264,6 @@ const listSwitching = async(val) => {
   isOpen.value = val
 }
 
-const changeConstructor = (val) => {
-  for (const key in constructorOptions.value) {
-    if (constructorOptions.value[key].ID === val) {
-      constructorData.value.name = constructorOptions.value[key].name
-      constructorData.value.onePrice = constructorOptions.value[key].onePrice
-    }
-  }
-}
-
-// 保存
-const saveConstructor = async() => {
-  if (constructorData.value.name === '' || constructorData.value.onePrice === null) {
-    ElMessage.error('数据不能为空')
-    return false
-  }
-  if (constructorData.value.id === null || constructorData.value.id === undefined) {
-    await createConstructor(constructorData.value).then(res => {
-      if (res.code === 0) {
-        ElMessage.success('新增成功')
-      }
-      queryData()
-    })
-  } else {
-    await updateConstructor(constructorData.value).then(res => {
-      if (res.code === 0) {
-        ElMessage.success('修改成功')
-      }
-      queryData()
-    })
-  }
-}
-
-// 删除
-const erasureConstructor = async() => {
-  if (constructorData.value.id === null) {
-    ElMessage.error('请选择人员')
-    return false
-  }
-  ElMessageBox.confirm(
-    '确定进行删除操作吗?',
-    '删除',
-    {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning',
-    }
-  )
-    .then(async() => {
-      await deleteConstructor(constructorData.value).then(res => {
-        if (res.code === 0) {
-          ElMessage.success('删除成功')
-        }
-        queryData()
-      })
-    })
-    .catch(() => {
-      ElMessage({
-        type: 'info',
-        message: '取消删除',
-      })
-    })
-}
-
 // 工时
 const workingDialog = ref(false)
 const workingHoursData = ref()

+ 7 - 0
web/src/view/superAdmin/user/user.vue

@@ -186,6 +186,12 @@
         >
           <el-input v-model="userInfo.email" />
         </el-form-item>
+        <el-form-item
+          label="人天单价"
+          prop="onePrice"
+        >
+          <el-input v-model.number="userInfo.onePrice" />
+        </el-form-item>
         <el-form-item
           label="用户角色"
           prop="authorityId"
@@ -357,6 +363,7 @@ const userInfo = ref({
   headerImg: '',
   authorityId: '',
   enable: 1,
+  onPrice: 0,
 })
 
 const rules = ref({