倚楼听风雨 пре 3 година
родитељ
комит
dcb80364cb
42 измењених фајлова са 1019 додато и 139 уклоњено
  1. 23 0
      api/v1/dataStatistics/wechat_scanner_ledger.go
  2. 5 3
      api/v1/rentComputer/enter.go
  3. 40 1
      api/v1/rentComputer/rent_computer.go
  4. 63 0
      api/v1/rentComputer/rent_computer_ledger.go
  5. 1 1
      api/v1/rentComputer/rent_computer_shop.go
  6. 43 24
      api/v1/typeManage/responsiblePerson.go
  7. 1 0
      config.yaml
  8. 1 0
      config/send_url.go
  9. 2 0
      initialize/router.go
  10. 21 7
      initialize/timer.go
  11. 3 0
      model/dataStatistics/data_abnormal_rate.go
  12. 12 1
      model/dataStatistics/request/wechat_scanner_ledger.go
  13. 10 8
      model/dataStatistics/response/wechat_scanner_ledger.go
  14. 10 8
      model/dataStatistics/wechat_scanner_ledger.go
  15. 15 0
      model/rentComputer/rent_computer.go
  16. 24 0
      model/rentComputer/rent_computer_ledger.go
  17. 25 0
      model/rentComputer/request/rent_computer.go
  18. 21 0
      model/rentComputer/request/rent_computer_ledger.go
  19. 1 0
      model/rentComputer/response/rent_computer.go
  20. 22 0
      model/rentComputer/response/rent_computer_ledger.go
  21. BIN
      resource/excel/2023-02-12-扫码消耗明细.xlsx
  22. BIN
      resource/excel/2023-02-13-pc.xlsx
  23. BIN
      resource/excel/2023-02-13-扫码消耗明细.xlsx
  24. BIN
      resource/excel/2023-02-18-租机台账.xlsx
  25. BIN
      resource/excel/2023-02-19-租机台账.xlsx
  26. BIN
      resource/excel/2023-02-20-扫码消耗明细.xlsx
  27. BIN
      resource/excel/2023-02-20-租机台账.xlsx
  28. 1 0
      router/dataStatistics/wechat_scanner_ledger.go
  29. 5 1
      router/rentComputer/rent_computer.go
  30. 20 0
      router/rentComputer/rent_computer_ledger.go
  31. 9 8
      router/typeManage/responsiblePerson.go
  32. 6 5
      service/dataStatistics/data_abnormal_rate.go
  33. 58 24
      service/dataStatistics/wechat_scanner_api.go
  34. 9 1
      service/dataStatistics/wechat_scanner_detailed.go
  35. 28 2
      service/dataStatistics/wechat_scanner_ledger.go
  36. 13 13
      service/log/log_statistics.go
  37. 1 0
      service/rentComputer/enter.go
  38. 265 14
      service/rentComputer/rent_computer.go
  39. 155 0
      service/rentComputer/rent_computer_ledger.go
  40. 85 0
      service/system/sys_robot.go
  41. 21 18
      service/typeManage/tm_responsiblePerson.go
  42. BIN
      uploads/file/28ca53d2b7bb4aa13549b4022c79dca1_20230215183015.jpg

+ 23 - 0
api/v1/dataStatistics/wechat_scanner_ledger.go

@@ -31,3 +31,26 @@ func (s *ApiWeChatScannerLedger) GetWeChatScannerLedgerList(c *gin.Context) {
 		}, "获取成功", c)
 	}
 }
+
+func (e *ApiWeChatScannerLedger) ExportLedgerListExcel(c *gin.Context) {
+	var excelInfo request.ExcelLedgerInfo
+	_ = c.ShouldBindJSON(&excelInfo)
+	paramsInfo := excelInfo.InfoList
+	paramsInfo.PageSize = 300
+	paramsInfo.Page = 1
+	list, _, err := ServiceWeChatScannerLedger.WeChatScannerLedgerList(c, paramsInfo.WeChatScannerLedger, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取数据失败!", zap.Error(err))
+		response.FailWithMessage("获取数据失败", c)
+		return
+	}
+	filePath := global.GVA_CONFIG.Excel.Dir + excelInfo.FileName
+	err = ServiceWeChatScannerLedger.ParseInfoList2Excel(list, filePath)
+	if err != nil {
+		global.GVA_LOG.Error("转换Excel失败!", zap.Error(err))
+		response.FailWithMessage("转换Excel失败", c)
+		return
+	}
+	c.Writer.Header().Add("success", "true")
+	c.File(filePath)
+}

+ 5 - 3
api/v1/rentComputer/enter.go

@@ -7,11 +7,13 @@ type ApiGroup struct {
 	ApiRentComputer
 	ApiRentComputerShop
 	ApiRentSetMeal
+	ApiRentComputerLedger
 	// Code generated by log-server End; DO NOT EDIT.
 }
 
 var (
-	ServiceRentComputer     = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputer
-	ServiceRentComputerShop = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputerShop
-	ServiceRentSetMeal      = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentSetMeal
+	ServiceRentComputer       = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputer
+	ServiceRentComputerLedger = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputerLedger
+	ServiceRentComputerShop   = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputerShop
+	ServiceRentSetMeal        = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentSetMeal
 )

+ 40 - 1
api/v1/rentComputer/rent_computer.go

@@ -39,7 +39,9 @@ func (s *ApiRentComputer) GetRentComputerList(c *gin.Context) {
 }
 
 func (s *ApiRentComputer) GetRentComputerNum(c *gin.Context) {
-	num := ServiceRentComputer.GetRentComputerNum()
+	var paramsInfo request.GetStatisticsComputerRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	num := ServiceRentComputer.GetRentComputerNum(c, paramsInfo.RentComputer)
 	response.OkWithDetailed(num, "获取成功", c)
 }
 
@@ -96,6 +98,7 @@ func (s *ApiRentComputer) DeleteRentComputerByIds(c *gin.Context) {
 		response.OkWithMessage("删除成功", c)
 	}
 }
+
 func (s *ApiRentComputer) DeleteRentComputerById(c *gin.Context) {
 	var api rentComputer.RentComputer
 	_ = c.ShouldBindJSON(&api)
@@ -136,3 +139,39 @@ func (e *ApiRentComputer) ImportExcel(c *gin.Context) {
 	}
 	response.OkWithMessage("导入成功,请刷新查看", c)
 }
+
+// RenewRentComputer 租机续费
+func (s *ApiRentComputer) RenewRentComputer(c *gin.Context) {
+	var api request.RenewRentComputerRequest
+	_ = c.ShouldBindJSON(&api)
+	if err := ServiceRentComputer.RenewRentComputer(api); err != nil {
+		global.GVA_LOG.Error("租机续费失败!", zap.Error(err))
+		response.FailWithMessage("租机续费失败", c)
+	} else {
+		response.OkWithMessage("租机续费成功", c)
+	}
+}
+
+// RentingOutRentComputer 租机退租
+func (s *ApiRentComputer) RentingOutRentComputer(c *gin.Context) {
+	var api request.RentingOutRentComputerRequest
+	_ = c.ShouldBindJSON(&api)
+	if errMessage, err, okMessage := ServiceRentComputer.RentingOutRentComputer(api); err != nil || errMessage != "" {
+		global.GVA_LOG.Error("租机退租失败!", zap.Error(err))
+		response.FailWithMessage("租机退租失败", c)
+	} else {
+		response.OkWithMessage(okMessage, c)
+	}
+}
+
+// ReplaceNumRentComputer 租机换编号
+func (s *ApiRentComputer) ReplaceNumRentComputer(c *gin.Context) {
+	var api request.ReplaceNumRentComputerRequest
+	_ = c.ShouldBindJSON(&api)
+	if errMessage, err, okMessage := ServiceRentComputer.ReplaceNumRentComputer(api); err != nil || errMessage != "" {
+		//global.GVA_LOG.Error("租机换编号失败!"+errMessage, zap.Error(err))
+		response.FailWithMessage("租机换编号失败!"+errMessage, c)
+	} else {
+		response.OkWithMessage(okMessage, c)
+	}
+}

+ 63 - 0
api/v1/rentComputer/rent_computer_ledger.go

@@ -0,0 +1,63 @@
+package rentComputer
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/log/response"
+	"log-server/model/rentComputer/request"
+)
+
+type ApiRentComputerLedger struct {
+}
+
+func (s *ApiRentComputerLedger) GetRentComputerLedgerList(c *gin.Context) {
+	var paramsInfo request.GetComputerLedgerRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceRentComputerLedger.RentComputerLedgerList(c, paramsInfo.RentComputerLedger, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}
+
+func (s *ApiRentComputerLedger) GetRentComputerLedgerNum(c *gin.Context) {
+	var paramsInfo request.GetComputerLedgerRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	num := ServiceRentComputerLedger.GetRentComputerLedgerNum(c, paramsInfo.RentComputerLedger)
+	response.OkWithDetailed(num, "获取成功", c)
+}
+
+func (s *ApiRentComputerLedger) ExportLedgerListExcel(c *gin.Context) {
+	var excelInfo request.ExcelLedgerInfo
+	_ = c.ShouldBindJSON(&excelInfo)
+	paramsInfo := excelInfo.InfoList
+	paramsInfo.PageSize = 300
+	paramsInfo.Page = 1
+	list, _, err := ServiceRentComputerLedger.RentComputerLedgerList(c, paramsInfo.RentComputerLedger, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取数据失败!", zap.Error(err))
+		response.FailWithMessage("获取数据失败", c)
+		return
+	}
+	filePath := global.GVA_CONFIG.Excel.Dir + excelInfo.FileName
+	err = ServiceRentComputerLedger.ParseInfoList2Excel(list, filePath)
+	if err != nil {
+		global.GVA_LOG.Error("转换Excel失败!", zap.Error(err))
+		response.FailWithMessage("转换Excel失败", c)
+		return
+	}
+	c.Writer.Header().Add("success", "true")
+	c.File(filePath)
+}

+ 1 - 1
api/v1/rentComputer/rent_computer_shop.go

@@ -14,7 +14,7 @@ type ApiRentComputerShop struct {
 }
 
 func (s *ApiRentComputerShop) GetRentComputerShopList(c *gin.Context) {
-	global.GVA_LOG.Info("api----GetComputerShopList----strat")
+	//global.GVA_LOG.Info("api----GetComputerShopList----strat")
 	var paramsInfo request.GetStatisticsComputerShopRequest
 	_ = c.ShouldBindJSON(&paramsInfo)
 	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {

+ 43 - 24
api/v1/typeManage/responsiblePerson.go

@@ -11,17 +11,17 @@ import (
 	"log-server/utils"
 )
 
-type ResponsiblePersonApi struct {}
+type ResponsiblePersonApi struct{}
 
-//增加负责人
-func (r *ResponsiblePersonApi) CreateResponsiblePerson(c *gin.Context)  {
+// 增加负责人
+func (r *ResponsiblePersonApi) CreateResponsiblePerson(c *gin.Context) {
 	var responsiblePerson typeManage.ResponsiblePerson
 	_ = c.ShouldBindJSON(&responsiblePerson)
-	if err := utils.Verify(responsiblePerson, utils.ResponsiblePersonVerify);err != nil{
+	if err := utils.Verify(responsiblePerson, utils.ResponsiblePersonVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if err := responsiblePersonService.CreateResponsiblePerson(responsiblePerson);err != nil{
+	if err := responsiblePersonService.CreateResponsiblePerson(responsiblePerson); err != nil {
 		global.GVA_LOG.Error("创建失败!", zap.Error(err))
 		response.FailWithMessage("创建失败", c)
 	} else {
@@ -29,8 +29,8 @@ func (r *ResponsiblePersonApi) CreateResponsiblePerson(c *gin.Context)  {
 	}
 }
 
-//删除单个负责人
-func (r *ResponsiblePersonApi) DeleteResponsiblePerson(c *gin.Context)  {
+// 删除单个负责人
+func (r *ResponsiblePersonApi) DeleteResponsiblePerson(c *gin.Context) {
 	var person typeManage.ResponsiblePerson
 	_ = c.ShouldBindJSON(&person)
 	//数据校验
@@ -38,7 +38,7 @@ func (r *ResponsiblePersonApi) DeleteResponsiblePerson(c *gin.Context)  {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if err := responsiblePersonService.DeleteResponsiblePerson(person);err != nil{
+	if err := responsiblePersonService.DeleteResponsiblePerson(person); err != nil {
 		global.GVA_LOG.Error("删除失败!", zap.Error(err))
 		response.FailWithMessage("删除失败", c)
 	} else {
@@ -46,11 +46,11 @@ func (r *ResponsiblePersonApi) DeleteResponsiblePerson(c *gin.Context)  {
 	}
 }
 
-//批量删除
-func (r *ResponsiblePersonApi) DeleteResponsiblePersonsByIds(c *gin.Context)  {
+// 批量删除
+func (r *ResponsiblePersonApi) DeleteResponsiblePersonsByIds(c *gin.Context) {
 	var ids request.IdsReq
 	_ = c.ShouldBindJSON(&ids)
-	if err := responsiblePersonService.DeleteResponsiblePersonsByIds(ids);err != nil{
+	if err := responsiblePersonService.DeleteResponsiblePersonsByIds(ids); err != nil {
 		global.GVA_LOG.Error("删除失败!", zap.Error(err))
 		response.FailWithMessage("删除失败", c)
 	} else {
@@ -59,15 +59,15 @@ func (r *ResponsiblePersonApi) DeleteResponsiblePersonsByIds(c *gin.Context)  {
 
 }
 
-//更新负责人信息
-func (r *ResponsiblePersonApi) UpdateResponsiblePerson(c *gin.Context)  {
+// 更新负责人信息
+func (r *ResponsiblePersonApi) UpdateResponsiblePerson(c *gin.Context) {
 	var person typeManage.ResponsiblePerson
 	_ = c.ShouldBindJSON(&person)
-	if err := utils.Verify(person, utils.ResponsiblePersonVerify);err != nil{
+	if err := utils.Verify(person, utils.ResponsiblePersonVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if err := responsiblePersonService.UpdateResponsiblePerson(person);err != nil{
+	if err := responsiblePersonService.UpdateResponsiblePerson(person); err != nil {
 		global.GVA_LOG.Error("修改失败!", zap.Error(err))
 		response.FailWithMessage("修改失败", c)
 	} else {
@@ -76,16 +76,16 @@ func (r *ResponsiblePersonApi) UpdateResponsiblePerson(c *gin.Context)  {
 
 }
 
-//获取单个负责人信息
-func (r *ResponsiblePersonApi) GetResponsiblePersonById(c *gin.Context)  {
+// 获取单个负责人信息
+func (r *ResponsiblePersonApi) GetResponsiblePersonById(c *gin.Context) {
 	var id request.GetById
 	_ = c.ShouldBindJSON(&id)
 	//数据校验
-	if err := utils.Verify(id, utils.IdVerify);err != nil{
+	if err := utils.Verify(id, utils.IdVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if person, err := responsiblePersonService.GetResponsiblePersonById(id.ID);err != nil{
+	if person, err := responsiblePersonService.GetResponsiblePersonById(id.ID); err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))
 		response.FailWithMessage("获取失败", c)
 	} else {
@@ -93,15 +93,15 @@ func (r *ResponsiblePersonApi) GetResponsiblePersonById(c *gin.Context)  {
 	}
 }
 
-//条件查询所有负责人
-func (r *ResponsiblePersonApi) GetResponsiblePerson(c *gin.Context)  {
+// 条件查询所有负责人
+func (r *ResponsiblePersonApi) GetResponsiblePerson(c *gin.Context) {
 	var pageInfo typeManage.SearchResponsiblePersonParams
 	_ = c.ShouldBindJSON(&pageInfo)
-	if err := utils.Verify(pageInfo, utils.ResponsiblePersonVerify);err != nil{
+	if err := utils.Verify(pageInfo, utils.ResponsiblePersonVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if list, total, err := responsiblePersonService.GetResponsiblePerson(pageInfo.ResponsiblePerson, pageInfo.PageInfo, pageInfo.OrderKey, pageInfo.Desc);err != nil{
+	if list, total, err := responsiblePersonService.GetResponsiblePerson(pageInfo.ResponsiblePerson, pageInfo.PageInfo, pageInfo.OrderKey, pageInfo.Desc); err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))
 		response.FailWithMessage("获取失败", c)
 	} else {
@@ -113,4 +113,23 @@ func (r *ResponsiblePersonApi) GetResponsiblePerson(c *gin.Context)  {
 			PageSize: pageInfo.PageSize,
 		}, "获取成功", c)
 	}
-}
+}
+
+// GetResponsiblePersonAll 查询所有
+func (r *ResponsiblePersonApi) GetResponsiblePersonAll(c *gin.Context) {
+	//var pageInfo typeManage.SearchResponsiblePersonParams
+	//_ = c.ShouldBindJSON(&pageInfo)
+	//if err := utils.Verify(pageInfo, utils.ResponsiblePersonVerify); err != nil {
+	//	response.FailWithMessage(err.Error(), c)
+	//	return
+	//}
+	if list, err := responsiblePersonService.GetResponsiblePersonAll(); err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		//响应结果
+		response.OkWithDetailed(response.PageResult{
+			List: list,
+		}, "获取成功", c)
+	}
+}

+ 1 - 0
config.yaml

@@ -159,5 +159,6 @@ zap:
   log-in-console: true
 send-url:
   computer-send-url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b111"
+  keyword-send-url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=34cbfa5a-c31d-464f-baf8-8363d6f4ac6a"
 #extranet-domain:
 #  control: "http://192.168.50.35:8099"

+ 1 - 0
config/send_url.go

@@ -2,4 +2,5 @@ package config
 
 type SendUrl struct {
 	ComputerSendUrl string `mapstructure:"computer-send-url" json:"computer-send-url" yaml:"computer-send-url"`
+	KeyWordSendUrl  string `mapstructure:"keyword-send-url" json:"keyword-send-url" yaml:"keyword-send-url"`
 }

+ 2 - 0
initialize/router.go

@@ -67,10 +67,12 @@ func Routers() *gin.Engine {
 		rentComputerRouter.InitRentComputerRouter(PublicGroup)     //租机管理
 		rentComputerRouter.InitRentComputerShopRouter(PublicGroup) // 租机供应商管理
 		rentComputerRouter.InitRentSetMealRouter(PublicGroup)
+		rentComputerRouter.InitRentComputerLedgerRouter(PublicGroup)
 		dataStatisticsRouter.InitDataAbnormalRateRouter(PublicGroup)      //数据统计
 		dataStatisticsRouter.InitWeChatScannerApiRouter(PublicGroup)      //数据统计
 		dataStatisticsRouter.InitWeChatScannerDetailedRouter(PublicGroup) //数据统计
 		dataStatisticsRouter.InitWeChatScannerLedgerRouter(PublicGroup)   //数据统计
+
 	}
 	PrivateGroup := Router.Group("")
 	PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())

+ 21 - 7
initialize/timer.go

@@ -5,6 +5,7 @@ import (
 	"log-server/service/dataStatistics"
 	"log-server/service/log"
 	"log-server/service/rentComputer"
+	"log-server/service/system"
 	"log-server/service/task"
 
 	"log-server/config"
@@ -18,7 +19,8 @@ var syncData = new(task.SyncData)
 var serviceRentComputer = new(rentComputer.ServiceRentComputer)
 var serviceWeChatScannerApi = new(dataStatistics.ServiceWeChatScannerApi)
 var serviceDataAbnormalRate = new(dataStatistics.ServiceDataAbnormalRate)
-var ServiceWeChatScannerDetailed = new(dataStatistics.ServiceWeChatScannerDetailed)
+var serviceWeChatScannerDetailed = new(dataStatistics.ServiceWeChatScannerDetailed)
+var robotService = new(system.RobotService)
 
 func Timer() {
 	if global.GVA_CONFIG.Timer.Start {
@@ -90,12 +92,18 @@ func Timer() {
 	//}
 
 	// 定时检查是否有电脑到期,修改租机状态@every 1s
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0/59 0/5 * * * *", serviceRentComputer.CheckIsExpire)
-	//if err != nil {
-	//	fmt.Println("add CheckIsExpire timer error:", err)
-	//}
+	_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0 0/5 * * * *", serviceRentComputer.CheckIsExpire)
+	if err != nil {
+		fmt.Println("add CheckIsExpire timer error:", err)
+	}
+	// 定时生成租机每日台账@every 1s
+	_, err = global.GVA_Timer.AddTaskByFunc("CreateRentComputerLedger", "0 30 23 * * *", serviceRentComputer.CreateRentComputerLedger)
+	if err != nil {
+		fmt.Println("add CreateRentComputerLedger timer error:", err)
+	}
 
 	//定时获取扫码平台余额,每小时执行一次
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
 	_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
 	if err != nil {
 		fmt.Println("add SyncGetWeChatScannerBalance timer error:", err)
@@ -107,15 +115,21 @@ func Timer() {
 	}
 
 	//定时更新当日微信扫码订单列表
-	_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", ServiceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", serviceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
 	if err != nil {
 		fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
 	}
 
 	//0点更新昨日微信扫码订单列表
-	_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", ServiceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", serviceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
 	if err != nil {
 		fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
 	}
 
+	//半小时同步一次机房设备信息,播报是否有异常
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
+	if err != nil {
+		fmt.Println("add SyncJfDevicesMessage timer error:", err)
+	}
+
 }

+ 3 - 0
model/dataStatistics/data_abnormal_rate.go

@@ -27,6 +27,9 @@ type DataAbnormalRate struct {
 	NumOrderPay       int    `json:"num_order_pay"`       // 付费订单数
 	NumPay            int    `json:"num_pay"`             //付费成功数
 	RatePaySuccess    string `json:"rate_pay_success"`    //付费成功率
+	//WeChatOrderNum    int    `json:"wechat_order_num"`    //微信订单数
+	//WeChatOrderNew      int `json:"wechat_order_new"`      //新增订单数
+	//WeChatOrderRetained int `json:"wechat_order_retained"` //留存订单数
 }
 
 func (DataAbnormalRate) TableName() string {

+ 12 - 1
model/dataStatistics/request/wechat_scanner_ledger.go

@@ -1,6 +1,8 @@
 package request
 
-import "log-server/model/dataStatistics"
+import (
+	"log-server/model/dataStatistics"
+)
 
 type WeChatScannerLedgerRequest struct {
 	dataStatistics.WeChatScannerLedger
@@ -8,3 +10,12 @@ type WeChatScannerLedgerRequest struct {
 	OrderKey string `json:"orderKey"` // 排序
 	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
 }
+type ExcelLedgerInfo struct {
+	FileName string `json:"fileName"` // 文件名
+	InfoList struct {
+		dataStatistics.WeChatScannerLedger
+		PageInfo
+		OrderKey string `json:"orderKey"` // 排序
+		Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+	} `json:"infoList"`
+}

+ 10 - 8
model/dataStatistics/response/wechat_scanner_ledger.go

@@ -1,12 +1,14 @@
 package response
 
 type WeChatScannerLedgerResponse struct {
-	Id             uint   `json:"id"`
-	NewDate        string `json:"new_date"`        //日期
-	TaskId         int    `json:"task_id"`         //任务id
-	TaskName       string `json:"task_name"`       //任务名
-	Platform       string `json:"platform"`        //平台名
-	Ledger         string `json:"ledger"`          //总消耗
-	LedgerNew      string `json:"ledger_new"`      //新增消耗
-	LedgerRetained string `json:"ledger_retained"` //留存消耗
+	Id                uint   `json:"id"`
+	NewDate           string `json:"new_date"`            //日期
+	TaskId            int    `json:"task_id"`             //任务id
+	TaskName          string `json:"task_name"`           //任务名
+	Platform          string `json:"platform"`            //平台名
+	Ledger            string `json:"ledger"`              //总消耗
+	LedgerNew         string `json:"ledger_new"`          //新增消耗
+	LedgerRetained    string `json:"ledger_retained"`     //留存消耗
+	UnitPriceNew      string `json:"unit_price_new"`      //新增单价
+	UnitPriceRetained string `json:"unit_price_retained"` //留存单价
 }

+ 10 - 8
model/dataStatistics/wechat_scanner_ledger.go

@@ -1,14 +1,16 @@
 package dataStatistics
 
 type WeChatScannerLedger struct {
-	Id             uint   `json:"id"`
-	NewDate        string `json:"new_date"`        //日期
-	TaskId         int    `json:"task_id"`         //任务id
-	TaskName       string `json:"task_name"`       //任务名
-	Platform       string `json:"platform"`        //平台名
-	Ledger         string `json:"ledger"`          //总消耗
-	LedgerNew      string `json:"ledger_new"`      //新增消耗
-	LedgerRetained string `json:"ledger_retained"` //留存消耗
+	Id                uint   `json:"id"`
+	NewDate           string `json:"new_date"`            //日期
+	TaskId            int    `json:"task_id"`             //任务id
+	TaskName          string `json:"task_name"`           //任务名
+	Platform          string `json:"platform"`            //平台名
+	Ledger            string `json:"ledger"`              //总消耗
+	LedgerNew         string `json:"ledger_new"`          //新增消耗
+	LedgerRetained    string `json:"ledger_retained"`     //留存消耗
+	UnitPriceNew      string `json:"unit_price_new"`      //新增单价
+	UnitPriceRetained string `json:"unit_price_retained"` //留存单价
 }
 
 func (WeChatScannerLedger) TableName() string {

+ 15 - 0
model/rentComputer/rent_computer.go

@@ -19,8 +19,23 @@ type RentComputer struct {
 	IsExpire          int     `json:"is_expire"`          //是否到期 0:否 1:是 2:明日到期
 	SetMealId         uint    `json:"set_meal_id"`        //套餐名id
 	IsOffShelf        int     `json:"is_off_shelf"`       //是否下架 0:否 1:是
+	DirectorName      string  `json:"director_name"`      //具体使用人
 }
 
 func (RentComputer) TableName() string {
 	return "rent_computer"
 }
+
+type RentComputerSetMeal struct {
+	PcNum        string  `json:"pc_num"`         //电脑编号
+	PcName       string  `json:"pc_name"`        //电脑名称
+	ShopId       uint    `json:"shop_id"`        //供应商ID
+	RentStart    string  `json:"rent_start"`     //起租时间
+	RentDuration int     `json:"rent_duration"`  //租赁天数
+	RentEnd      string  `json:"rent_end"`       //到期时间
+	Remark       string  `json:"remark"`         //备注
+	IsExpire     int     `json:"is_expire"`      //是否到期 0:否 1:是 2:明日到期
+	SetMealId    uint    `json:"set_meal_id"`    //套餐名id
+	RentPrice    float64 `json:"rent_price"`     //价格标准
+	RentPriceDay float64 `json:"rent_price_day"` //折算天租金
+}

+ 24 - 0
model/rentComputer/rent_computer_ledger.go

@@ -0,0 +1,24 @@
+package rentComputer
+
+type RentComputerLedger struct {
+	Id                uint    `json:"id"`
+	UpdateTime        string  `json:"update_time"`          // 更新时间
+	CreateTime        string  `json:"create_time"`          // 创建时间
+	NewDate           string  `json:"new_date"`             // 台账日期
+	PcNum             string  `json:"pc_num"`               //电脑编号
+	PcName            string  `json:"pc_name"`              //电脑名称
+	ShopId            uint    `json:"shop_id"`              //供应商ID
+	RentStartThen     string  `json:"rent_start_then"`      //起租时间
+	RentDurationThen  int     `json:"rent_duration_then"`   //租赁天数
+	RentEndThen       string  `json:"rent_end_then"`        //到期时间
+	RentPriceThen     float64 `json:"rent_price_then"`      //当时的价格标准
+	RentPriceDayThen  float64 `json:"rent_price_day_then"`  //折算天租金
+	RentPriceUsedThen float64 `json:"rent_price_used_then"` //当前租赁期内已产生租金
+	IsExpire          int     `json:"is_expire"`            //是否到期 0:否 1:是 2:明日到期
+	SetMealId         uint    `json:"set_meal_id"`          //套餐名id
+	Remark            string  `json:"remark"`               //备注
+}
+
+func (RentComputerLedger) TableName() string {
+	return "rent_computer_ledger"
+}

+ 25 - 0
model/rentComputer/request/rent_computer.go

@@ -30,4 +30,29 @@ type ComputerRequest struct {
 	IsExpire          int     `json:"is_expire"`          //是否到期 0:否 1:是 2:明日到期
 	SetMealId         uint    `json:"set_meal_id"`        //套餐名id
 	IsOffShelf        int     `json:"is_off_shelf"`       //是否下架 0:否 1:是
+	DirectorName      string  `json:"director_name"`      //具体使用人
+}
+type RenewRentComputerRequest struct {
+	PcId       uint   `json:"pc_id"`       // id
+	UpdateTime string `json:"update_time"` // 更新时间
+	PcNum      string `json:"pc_num"`      //电脑编号
+	Day        int    `json:"day"`         //租赁天数
+	RentRenew  string `json:"rent_renew"`  //到期时间
+	Remark     string `json:"remark"`      //备注
+	IsExpire   int    `json:"is_expire"`   //是否到期 0:否 1:是 2:明日到期
+}
+
+type ReplaceNumRentComputerRequest struct {
+	PcNumOld string `json:"pc_num_old"`
+	PcNumNew string `json:"pc_num_new"`
+	ShopId   uint   `json:"shop_id"` //供应商ID
+}
+type RentingOutRentComputerRequest struct {
+	PcId    uint      `json:"pc_id"`    // id
+	RentEnd string    `json:"rent_end"` //到期时间
+	AddList []AddList `json:"add_list"`
+}
+type AddList struct {
+	PcNum  string `json:"pc_num"`
+	AddDay int    `json:"add_day"`
 }

+ 21 - 0
model/rentComputer/request/rent_computer_ledger.go

@@ -0,0 +1,21 @@
+package request
+
+import (
+	"log-server/model/rentComputer"
+)
+
+type GetComputerLedgerRequest struct {
+	rentComputer.RentComputerLedger
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}
+type ExcelLedgerInfo struct {
+	FileName string `json:"fileName"` // 文件名
+	InfoList struct {
+		rentComputer.RentComputerLedger
+		PageInfo
+		OrderKey string `json:"orderKey"` // 排序
+		Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+	} `json:"infoList"`
+}

+ 1 - 0
model/rentComputer/response/rent_computer.go

@@ -24,6 +24,7 @@ type ComputerStatisticsReply2 struct {
 	IsOffShelf        int     `json:"is_off_shelf"`       //是否下架 0:否 1:是
 	ShopName          string  `json:"shop_name"`          //供应商名
 	SetMealName       string  `json:"set_meal_name"`      //套餐名
+	DirectorName      string  `json:"director_name"`      //具体使用人
 }
 
 type ComputerIsExpire struct {

+ 22 - 0
model/rentComputer/response/rent_computer_ledger.go

@@ -0,0 +1,22 @@
+package response
+
+type RentComputerLedgerResponse struct {
+	Id                uint    `json:"id"`
+	UpdateTime        string  `json:"update_time"`          // 更新时间
+	CreateTime        string  `json:"create_time"`          // 创建时间
+	NewDate           string  `json:"new_date"`             // 台账日期
+	PcNum             string  `json:"pc_num"`               //电脑编号
+	PcName            string  `json:"pc_name"`              //电脑名称
+	ShopId            uint    `json:"shop_id"`              //供应商ID
+	RentStartThen     string  `json:"rent_start_then"`      //起租时间
+	RentDurationThen  int     `json:"rent_duration_then"`   //租赁天数
+	RentEndThen       string  `json:"rent_end_then"`        //到期时间
+	RentPriceThen     float64 `json:"rent_price_then"`      //当时的价格标准
+	RentPriceDayThen  float64 `json:"rent_price_day_then"`  //折算天租金
+	RentPriceUsedThen float64 `json:"rent_price_used_then"` //当前租赁期内已产生租金
+	IsExpire          int     `json:"is_expire"`            //是否到期 0:否 1:是 2:明日到期
+	SetMealId         uint    `json:"set_meal_id"`          //套餐名id
+	Remark            string  `json:"remark"`               //备注
+	ShopName          string  `json:"shop_name"`
+	SetMealName       string  `json:"set_meal_name"`
+}

BIN
resource/excel/2023-02-12-扫码消耗明细.xlsx


BIN
resource/excel/2023-02-13-pc.xlsx


BIN
resource/excel/2023-02-13-扫码消耗明细.xlsx


BIN
resource/excel/2023-02-18-租机台账.xlsx


BIN
resource/excel/2023-02-19-租机台账.xlsx


BIN
resource/excel/2023-02-20-扫码消耗明细.xlsx


BIN
resource/excel/2023-02-20-租机台账.xlsx


+ 1 - 0
router/dataStatistics/wechat_scanner_ledger.go

@@ -13,5 +13,6 @@ func (e *WeChatScannerLedgerRouter) InitWeChatScannerLedgerRouter(Router *gin.Ro
 	api := v1.ApiGroupApp.DataStatisticsGroup.ApiWeChatScannerLedger
 	{
 		excelRouter.POST("getWeChatScannerLedgerList", api.GetWeChatScannerLedgerList) //查询记录
+		excelRouter.POST("exportLedgerListExcel", api.ExportLedgerListExcel)           //导出记录
 	}
 }

+ 5 - 1
router/rentComputer/rent_computer.go

@@ -19,6 +19,10 @@ func (e *RentComputerRouter) InitRentComputerRouter(Router *gin.RouterGroup) {
 		excelRouter.PUT("editRentComputer", rentComputerApi.EditRentComputer)                  //修改记录
 		excelRouter.DELETE("deleteRentComputerByIds", rentComputerApi.DeleteRentComputerByIds) // 删除多条记录
 		excelRouter.DELETE("deleteRentComputerById", rentComputerApi.DeleteRentComputerById)   // 删除单个记录
-		excelRouter.POST("importExcel", rentComputerApi.ImportExcel)
+		excelRouter.POST("importExcel", rentComputerApi.ImportExcel)                           // 导入
+		excelRouter.POST("renewRentComputer", rentComputerApi.RenewRentComputer)               //租机续费
+		excelRouter.POST("replaceNumRentComputer", rentComputerApi.ReplaceNumRentComputer)     //租机更换编号
+		excelRouter.POST("rentingOutRentComputer", rentComputerApi.RentingOutRentComputer)     //租机提前退租
+
 	}
 }

+ 20 - 0
router/rentComputer/rent_computer_ledger.go

@@ -0,0 +1,20 @@
+package rentComputer
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type RentComputerLedgerRouter struct {
+}
+
+func (e *RentComputerRouter) InitRentComputerLedgerRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("rentComputer")
+	rentComputerApi := v1.ApiGroupApp.RentComputerApiGroup.ApiRentComputerLedger
+	{
+		excelRouter.POST("getRentComputerLedgerList", rentComputerApi.GetRentComputerLedgerList) //查询记录
+		excelRouter.POST("getRentComputerLedgerNum", rentComputerApi.GetRentComputerLedgerNum)
+		excelRouter.POST("exportRentLedgerListExcel", rentComputerApi.ExportLedgerListExcel)
+
+	}
+}

+ 9 - 8
router/typeManage/responsiblePerson.go

@@ -5,17 +5,18 @@ import (
 	v1 "log-server/api/v1"
 )
 
-type ResponsiblePersonRouter struct {}
+type ResponsiblePersonRouter struct{}
 
-func (r *ResponsiblePersonRouter) InitResponsiblePersonRouter(Router *gin.RouterGroup)  {
+func (r *ResponsiblePersonRouter) InitResponsiblePersonRouter(Router *gin.RouterGroup) {
 	responsiblePersonRouter := Router.Group("responsiblePerson")
 	responsiblePersonApi := v1.ApiGroupApp.TypeApiGroup.ResponsiblePersonApi
 	{
-		responsiblePersonRouter.POST("createResponsiblePerson",responsiblePersonApi.CreateResponsiblePerson)          // 增加负责人
-		responsiblePersonRouter.POST("deleteResponsiblePerson",responsiblePersonApi.DeleteResponsiblePerson)          // 删除单个负责人
-		responsiblePersonRouter.DELETE("deleteResponsiblePersonsByIds", responsiblePersonApi.DeleteResponsiblePersonsByIds)		//批量删除
-		responsiblePersonRouter.POST("updateResponsiblePerson",responsiblePersonApi.UpdateResponsiblePerson)          // 更新负责人信息
-		responsiblePersonRouter.POST("getResponsiblePersonById", responsiblePersonApi.GetResponsiblePersonById) 		//获取单个负责人信息
-		responsiblePersonRouter.POST("getResponsiblePerson",responsiblePersonApi.GetResponsiblePerson)          // 条件查询所有负责人
+		responsiblePersonRouter.POST("createResponsiblePerson", responsiblePersonApi.CreateResponsiblePerson)               // 增加负责人
+		responsiblePersonRouter.POST("deleteResponsiblePerson", responsiblePersonApi.DeleteResponsiblePerson)               // 删除单个负责人
+		responsiblePersonRouter.DELETE("deleteResponsiblePersonsByIds", responsiblePersonApi.DeleteResponsiblePersonsByIds) //批量删除
+		responsiblePersonRouter.POST("updateResponsiblePerson", responsiblePersonApi.UpdateResponsiblePerson)               // 更新负责人信息
+		responsiblePersonRouter.POST("getResponsiblePersonById", responsiblePersonApi.GetResponsiblePersonById)             //获取单个负责人信息
+		responsiblePersonRouter.POST("getResponsiblePerson", responsiblePersonApi.GetResponsiblePerson)                     // 条件查询所有负责人
+		responsiblePersonRouter.POST("getDirectorList", responsiblePersonApi.GetResponsiblePersonAll)                       // 查询所有负责人
 	}
 }

+ 6 - 5
service/dataStatistics/data_abnormal_rate.go

@@ -28,6 +28,11 @@ type XjfTotal struct {
 	GameId int
 }
 
+//type TencentOrderNum struct {
+//	TaskId int `json:"task_id"`
+//	Count  int `json:"count"`
+//}
+
 // QueryAbnormalRate 获取异常率列表
 func (s *ServiceDataAbnormalRate) QueryAbnormalRate(ctx context.Context, api request.InfoDataAbnormalRateRequest, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
 
@@ -180,11 +185,7 @@ func (s *ServiceDataAbnormalRate) SyncAbnormalRateByBatch() {
 	}
 	xjfJson, _ := simplejson.NewJson(dataXjf)
 	xjfArr, _ := xjfJson.Array()
-	//var num map[string][]XjfTotal /*创建集合,存储机房查询日志接口返回值 */
-	//num = make(map[string][]XjfTotal)
-
-	//var xjfMap map[int][]int
-	//xjfMap = make(map[int][]int)
+	//查询微信扫码订单数
 
 	//var num map[string]map[int]int /*创建集合,存储机房查询日志接口返回值 */
 	num := make(map[string]map[int]int)

+ 58 - 24
service/dataStatistics/wechat_scanner_api.go

@@ -9,7 +9,9 @@ import (
 	"log-server/model/dataStatistics"
 	"log-server/model/dataStatistics/request"
 	"log-server/model/dataStatistics/response"
+	"log-server/service/system"
 	"log-server/utils"
+	"strconv"
 	"strings"
 	"time"
 	//"time"
@@ -18,6 +20,8 @@ import (
 type ServiceWeChatScannerApi struct {
 }
 
+var robotService = new(system.RobotService)
+
 func (s *ServiceWeChatScannerApi) WeChatScannerApiList(ctx context.Context, api dataStatistics.WeChatScannerApi, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
 
 	db := global.GVA_DB.Model(&dataStatistics.WeChatScannerApi{})
@@ -86,65 +90,95 @@ func (s *ServiceWeChatScannerApi) SyncGetWeChatScannerBalance() {
 		empty  = ""
 	)
 	newDate := time.Now().Format("2006-01-02")
+	content := ">#### **【扫码平台】预警** (" + time.Now().Format("2006-01-02 15:04:05") + "):\n"
+	var keyWord string
 	//浪潮===============================================================
-	lc := s.GetLangchaoInfo()
-	dataLc, _ := simplejson.NewJson(lc)
-	code, _ := dataLc.Get("code").Int()
-	balanceLc := "0"
-	if code == 20000 {
-		balanceLc, _ = dataLc.Get("data").Get("balance").String()
-	}
-	//global.GVA_LOG.Info("浪潮扫码平台余额:" + balanceLc)
-	one := new(dataStatistics.WeChatScannerApi)
-	one.Name = "浪潮"
-	one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
-	one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
-	one.Balance = balanceLc
-	one.NewDate = newDate
-	_ = global.GVA_DB.Create(&one).Error
+	//lc, err := s.GetLangchaoInfo()
+	//if err != nil {
+	//	global.GVA_LOG.Error("获取浪潮扫码余额失败,平台可能异常,请注意排查!!!")
+	//	//keyWord = "获取浪潮扫码余额失败,平台可能异常,请注意排查!!!,错误信息:" + err.Error() + "\n"
+	//}
+	//dataLc, _ := simplejson.NewJson(lc)
+	//code, _ := dataLc.Get("code").Int()
+	//balanceLc := "0"
+	//if code == 20000 {
+	//	balanceLc, _ = dataLc.Get("data").Get("balance").String()
+	//}
+	////global.GVA_LOG.Info("浪潮扫码平台余额:" + balanceLc)
+	//one := new(dataStatistics.WeChatScannerApi)
+	//one.Name = "浪潮"
+	//one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	//one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+	//one.Balance = balanceLc
+	//one.NewDate = newDate
+	//_ = global.GVA_DB.Create(&one).Error
+
+	//==========================================================================
 	//海马==========================================================================
-	hm := s.GetHaimaInfo()
+	hm, err := s.GetHaimaInfo()
+	if err != nil {
+		global.GVA_LOG.Error("获取海马扫码余额失败,平台可能异常,请注意排查!!!")
+		keyWord = "获取海马扫码余额失败,平台可能异常,请注意排查!!!,错误信息:" + err.Error() + "\n"
+	}
 	//global.GVA_LOG.Info("1:" + string(hm))
 	//hm2 := strings.Trim(string(hm), "")
 	hm2 := strings.Replace(string(hm), string(ZWNBSP), empty, -1)
 	hm = []byte(hm2)
 	dataHm, _ := simplejson.NewJson(hm)
 	//global.GVA_LOG.Info("2:" + dataHm)
-	code, _ = dataHm.Get("code").Int()
+	code, _ := dataHm.Get("code").Int()
 
 	balanceHm := "0"
 	if code == 1 {
 		balanceHm, _ = dataHm.Get("data").String()
 	}
 	//global.GVA_LOG.Info("海马扫码平台余额:" + balanceHm)
-	one = new(dataStatistics.WeChatScannerApi)
+	one := new(dataStatistics.WeChatScannerApi)
 	one.Name = "海马"
 	one.Balance = balanceHm
 	one.NewDate = newDate
 	one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
 	one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
 	_ = global.GVA_DB.Create(&one).Error
+	//余额不足报警
+	//==============================================================================
+	//floatBalanceLc, _ := strconv.ParseFloat(balanceLc, 64)
+	floatBalanceHm, _ := strconv.ParseFloat(balanceHm, 64)
+	//浪潮余额少于10元报警
+	//if floatBalanceLc <= 10 {
+	//	keyWord += "浪潮扫码平台余额不足,当前余额:" + balanceLc + "元,请及时充值!!!\n"
+	//}
+	//海马余额少于100元报警
+	if floatBalanceHm <= 100 {
+		keyWord += "海马扫码平台余额不足,当前余额:" + balanceHm + "元,请及时充值!!!\n"
+		keyWord += "[海马网页充值](http://www.yundiani.com/h5/) [海马卡密购买](https://www.fakazhu.cn/links/B7EC925C)"
+	}
+	if keyWord != "" {
+		content += keyWord
+		url := global.GVA_CONFIG.SendUrl.KeyWordSendUrl
+		_, _ = robotService.PostRobotToEnterpriseWeChatByMarkdown(url, content)
+	}
 	return
 }
 
-// getLangchaoInfo 获取浪潮
-func (s *ServiceWeChatScannerApi) GetLangchaoInfo() (result []byte) {
+// GetLangchaoInfo  获取浪潮
+func (s *ServiceWeChatScannerApi) GetLangchaoInfo() (result []byte, err error) {
 	jfUrl := "http://202.189.7.240:8082/api/userInfo"
 	jfParams := map[string]string{
 		"username": "513022",
 		"password": "kfzsygdl",
 	}
-	result, _ = utils.HttpGet(jfUrl, jfParams)
+	result, err = utils.HttpGet(jfUrl, jfParams)
 	return
 }
 
-// getHaimaInfo 获取海马
-func (s *ServiceWeChatScannerApi) GetHaimaInfo() (result []byte) {
+// GetHaimaInfo 获取海马
+func (s *ServiceWeChatScannerApi) GetHaimaInfo() (result []byte, err error) {
 	jfUrl := "https://api.yundiani.com/api/openav/checkUserBalance"
 	jfParams := map[string]string{
 		"uname":    "513022",
 		"password": "b52fca684535d924fb0147b9afbff681",
 	}
-	result, _ = utils.HttpGet(jfUrl, jfParams)
+	result, err = utils.HttpGet(jfUrl, jfParams)
 	return
 }

+ 9 - 1
service/dataStatistics/wechat_scanner_detailed.go

@@ -15,7 +15,6 @@ import (
 	"strconv"
 	"strings"
 	"time"
-	//"time"
 )
 
 type ServiceWeChatScannerDetailed struct {
@@ -121,6 +120,7 @@ func (s *ServiceWeChatScannerDetailed) SyncYesterdayWeChatScannerDetailed() {
 
 // SyncWeChatScannerDetailed 定时批量同步微信扫码订单号明细,先将微信扫码的游戏写死
 func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
+
 	tencentTasks := map[int]WeChatGameInfo{
 		10101:    {GameName: "坦克前线", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
 		10360903: {GameName: "原始传奇-10360903", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
@@ -169,13 +169,17 @@ func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
 			var listNum []PlatformNum
 			PriceNew := 0.00
 			PriceRetained := 0.00
+			UnitPriceNew := 0.00
+			UnitPriceRetained := 0.00
 			_ = global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Select("platform", "COUNT(*) AS count").Where("new_date = ? and task_id = ? and platform = ? and new_retained = 1", today, k, platform).First(&listNum).Error
 			for _, e := range listNum {
 				if e.Platform == "海马" {
 					PriceNew = v.HmPriceNew * float64(e.Count)
+					UnitPriceNew = v.HmPriceNew
 				} else if e.Platform == "浪潮" {
 					//global.GVA_LOG.Info(strconv.Itoa(e.Count))
 					PriceNew = v.LcPriceNew * float64(e.Count)
+					UnitPriceNew = v.LcPriceNew
 					//global.GVA_LOG.Info(strconv.FormatFloat(PriceNew, 'f', 2, 64))
 				}
 			}
@@ -184,13 +188,17 @@ func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
 			for _, e := range listNum2 {
 				if e.Platform == "海马" {
 					PriceRetained = v.HmPriceRetained * float64(e.Count)
+					UnitPriceRetained = v.HmPriceRetained
 				} else if e.Platform == "浪潮" {
 					PriceRetained = v.LcPriceRetained * float64(e.Count)
+					UnitPriceRetained = v.LcPriceRetained
 				}
 			}
 			db1Ledger.LedgerNew = strconv.FormatFloat(PriceNew, 'f', 2, 64)
 			db1Ledger.LedgerRetained = strconv.FormatFloat(PriceRetained, 'f', 2, 64)
 			db1Ledger.Ledger = strconv.FormatFloat(PriceNew+PriceRetained, 'f', 2, 64)
+			db1Ledger.UnitPriceNew = strconv.FormatFloat(UnitPriceNew, 'f', 2, 64)
+			db1Ledger.UnitPriceRetained = strconv.FormatFloat(UnitPriceRetained, 'f', 2, 64)
 			//global.GVA_LOG.Info(strconv.Itoa(db1Ledger.TaskId))
 			//global.GVA_LOG.Info(db1Ledger.TaskName)
 			//global.GVA_LOG.Info(db1Ledger.LedgerNew)

+ 28 - 2
service/dataStatistics/wechat_scanner_ledger.go

@@ -2,7 +2,9 @@ package dataStatistics
 
 import (
 	"context"
+	"fmt"
 	_ "github.com/bitly/go-simplejson"
+	"github.com/xuri/excelize/v2"
 	"go.uber.org/zap"
 	"log-server/global"
 	"log-server/model/dataStatistics"
@@ -22,7 +24,7 @@ type ServiceWeChatScannerLedger struct {
 //	HmPriceRetained float64
 //}
 
-func (s *ServiceWeChatScannerLedger) WeChatScannerLedgerList(ctx context.Context, api dataStatistics.WeChatScannerLedger, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+func (s *ServiceWeChatScannerLedger) WeChatScannerLedgerList(ctx context.Context, api dataStatistics.WeChatScannerLedger, info request.PageInfo, order string, desc bool) ([]*response.WeChatScannerLedgerResponse, int64, error) {
 
 	db := global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{})
 	//global.GVA_LOG.Info(api.NewDate)
@@ -40,7 +42,7 @@ func (s *ServiceWeChatScannerLedger) WeChatScannerLedgerList(ctx context.Context
 	limit := info.PageSize
 	offset := info.PageSize * (info.Page - 1)
 	//var statisticsLogs []*log.LogComputer
-	var apiList []dataStatistics.WeChatScannerLedger
+	var apiList []*response.WeChatScannerLedgerResponse
 	db = db.Limit(limit).Offset(offset)
 	if order != "" {
 		var OrderStr string
@@ -78,8 +80,32 @@ func (s *ServiceWeChatScannerLedger) WeChatScannerLedgerList(ctx context.Context
 		oneResponse.Ledger = e.Ledger
 		oneResponse.LedgerNew = e.LedgerNew
 		oneResponse.LedgerRetained = e.LedgerRetained
+		oneResponse.UnitPriceNew = e.UnitPriceNew
+		oneResponse.UnitPriceRetained = e.UnitPriceRetained
 
 		arrayResponse = append(arrayResponse, oneResponse)
 	}
 	return arrayResponse, total, err
 }
+
+func (exa *ServiceWeChatScannerLedger) ParseInfoList2Excel(infoList []*response.WeChatScannerLedgerResponse, filePath string) error {
+	excel := excelize.NewFile()
+	_ = excel.SetSheetRow("Sheet1", "A1", &[]string{"日期", "任务ID", "任务名称", "平台", "新增单价", "留存单价", "总消耗", "新增消耗", "留存消耗"})
+
+	for i, one := range infoList {
+		axis := fmt.Sprintf("A%d", i+2)
+		_ = excel.SetSheetRow("Sheet1", axis, &[]interface{}{
+			one.NewDate,
+			one.TaskId,
+			one.TaskName,
+			one.Platform,
+			one.UnitPriceNew,
+			one.UnitPriceRetained,
+			one.Ledger,
+			one.LedgerNew,
+			one.LedgerRetained,
+		})
+	}
+	err := excel.SaveAs(filePath)
+	return err
+}

+ 13 - 13
service/log/log_statistics.go

@@ -723,7 +723,7 @@ func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.L
 	return statisticsLogsComputer, total, err
 }
 
-// 在线电脑
+// OnlineComputerStatistics 在线电脑
 func (s *ServiceStatisticsLog) OnlineComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) ([]*response.ComputerUseLogReply, int64, error) {
 	date := api.CreateDate
 	if date == "" {
@@ -783,7 +783,7 @@ func (s *ServiceStatisticsLog) OnlineComputerStatistics(ctx context.Context, api
 	return statisticsLogs, total, err
 }
 
-//根据游戏id查询数据
+// GameStatistics 根据游戏id查询数据
 func (s *ServiceStatisticsLog) GameStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo) (interface{}, int64, error) {
 	date := api.CreateDate
 	isCurrentDate := false
@@ -844,7 +844,7 @@ func (s *ServiceStatisticsLog) GameTargetInfo(ctx context.Context, date string,
 	return
 }
 
-// 同步群控任务数据到缓存
+// TaskStatisticsDataCache 同步群控任务数据到缓存
 func (s *ServiceStatisticsLog) TaskStatisticsDataCache() {
 	ctx := context.Background()
 	key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
@@ -885,7 +885,7 @@ func (s *ServiceStatisticsLog) TaskStatisticsDataCache() {
 	}
 }
 
-// 同步群控任务数据到缓存
+// TaskStatisticsDataCache1 同步群控任务数据到缓存
 func (s *ServiceStatisticsLog) TaskStatisticsDataCache1() {
 	ctx := context.Background()
 	key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
@@ -934,7 +934,7 @@ func (s *ServiceStatisticsLog) TaskStatisticsDataCache1() {
 	}
 }
 
-// 同步群控任务数据到缓存
+// GetComputerNum 同步群控任务数据到缓存
 func (s *ServiceStatisticsLog) GetComputerNum(date string) int64 {
 	var total int64
 	if date == "" {
@@ -946,7 +946,7 @@ func (s *ServiceStatisticsLog) GetComputerNum(date string) int64 {
 	return total
 }
 
-// 在线电脑接口
+// ComputerHeartbeat 在线电脑接口
 func (s *ServiceStatisticsLog) ComputerHeartbeat(c context.Context, onlineComputer request.OnlineComputerRequest) error {
 	err := s.LogicalLog.SetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate(), onlineComputer.PcCode, onlineComputer.Operator)
 	if err != nil {
@@ -956,7 +956,7 @@ func (s *ServiceStatisticsLog) ComputerHeartbeat(c context.Context, onlineComput
 	return err
 }
 
-// 在线电脑接口测试
+// ComputerTest 在线电脑接口测试
 func (s *ServiceStatisticsLog) ComputerTest(c context.Context) (interface{}, error) {
 	mps, err := s.LogicalLog.GetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate())
 	if err != nil {
@@ -965,7 +965,7 @@ func (s *ServiceStatisticsLog) ComputerTest(c context.Context) (interface{}, err
 	return mps, err
 }
 
-// 定时检查电脑情况
+// RegularCheckPc1 定时检查电脑情况
 func (s *ServiceStatisticsLog) RegularCheckPc1() {
 	ctx := context.Background()
 	date := s.LogicalLog.CurrentDate()
@@ -1114,11 +1114,11 @@ func (s *ServiceStatisticsLog) RegularDelCheckData() {
 	s.LogicalLog.DelHashKey(ctx, date)
 }
 
-//@author: [piexlmax](https://github.com/piexlmax)
-//@function: UpdatePc
-//@description: 根据id更新pc
-//@param: Computer log.Computer
-//@return: err error
+// @author: [piexlmax](https://github.com/piexlmax)
+// @function: UpdatePc
+// @description: 根据id更新pc
+// @param: Computer log.Computer
+// @return: err error
 func (a *ServiceStatisticsLog) UpdateComputerUseLog(c log.ComputerUseRemarks) (err error) {
 	if !errors.Is(global.GVA_DB.Where("create_date = ?", c.CreateDate).Where("pc_code = ?", c.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
 		var updateInfo = make(map[string]interface{})

+ 1 - 0
service/rentComputer/enter.go

@@ -5,5 +5,6 @@ type ServiceGroup struct {
 	ServiceRentComputer
 	ServiceRentComputerShop
 	ServiceRentSetMeal
+	ServiceRentComputerLedger
 	// Code generated by log-server End; DO NOT EDIT.
 }

+ 265 - 14
service/rentComputer/rent_computer.go

@@ -22,7 +22,7 @@ type ServiceRentComputer struct {
 func (s *ServiceRentComputer) RentComputerList(ctx context.Context, api rentComputer.RentComputer, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
 
 	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
-	db = db.Select("rent_computer.id,rent_computer.update_time,rent_computer.create_time,rent_computer.pc_num,rent_computer.set_meal_id," +
+	db = db.Select("rent_computer.id,rent_computer.update_time,rent_computer.create_time,rent_computer.pc_num,rent_computer.set_meal_id,rent_computer.director_name," +
 		"rent_computer.pc_name,rent_computer.shop_id,rent_computer.rent_start,rent_computer.rent_duration,rent_computer.is_off_shelf,rent_computer.rent_end," +
 		"rent_computer.remark,rent_computer.todesk_id,rent_computer.todesk_password,rent_computer.sunflower_id,rent_computer.sunflower_password,rent_computer.rent_price_used,rent_computer.is_expire," +
 		"s.name as shop_name, r.name as set_meal_name,r.rent_price,r.price_type,r.rent_price_day")
@@ -38,11 +38,19 @@ func (s *ServiceRentComputer) RentComputerList(ctx context.Context, api rentComp
 	if api.SetMealId != 0 {
 		db = db.Where("rent_computer.set_meal_id = ?", api.SetMealId)
 	}
+	if api.DirectorName != "ALL" {
+		if api.DirectorName == "" {
+			db = db.Where("rent_computer.director_name IS NULL")
+		} else {
+			db = db.Where("rent_computer.director_name = ?", api.DirectorName)
+		}
+	}
+	//
 	//global.GVA_LOG.Info(strconv.Itoa(int(api.IsOffShelf)))
 	//global.GVA_LOG.Info(strconv.Itoa(int(api.IsExpire)))
-	if api.IsOffShelf != -1 {
-		db = db.Where("rent_computer.is_off_shelf = ?", api.IsOffShelf)
-	}
+	//if api.IsOffShelf != -1 {
+	//	db = db.Where("rent_computer.is_off_shelf = ?", api.IsOffShelf)
+	//}
 	if api.IsExpire != -1 {
 		db = db.Where("rent_computer.is_expire = ?", api.IsExpire)
 	}
@@ -110,17 +118,37 @@ func (s *ServiceRentComputer) RentComputerList(ctx context.Context, api rentComp
 		statisticscomputer.IsOffShelf = statisticsLog.IsOffShelf
 		statisticscomputer.ShopName = statisticsLog.ShopName
 		statisticscomputer.SetMealName = statisticsLog.SetMealName
+		statisticscomputer.DirectorName = statisticsLog.DirectorName
 		statisticsLogsComputer = append(statisticsLogsComputer, statisticscomputer)
 	}
 	return statisticsLogsComputer, total, err
 }
 
-func (s *ServiceRentComputer) GetRentComputerNum() int64 {
+func (s *ServiceRentComputer) GetRentComputerNum(ctx context.Context, api rentComputer.RentComputer) int64 {
 	var total int64
 
 	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
 	db = db.Distinct("id")
-	db = db.Where("is_off_shelf = 0 and is_expire != 1")
+	//db = db.Where("is_off_shelf = 0 and is_expire != 1")
+	if api.PcNum != "" {
+		db = db.Where("rent_computer.pc_num = ?", api.PcNum)
+	}
+	if api.ShopId != 0 {
+		db = db.Where("rent_computer.shop_id = ?", api.ShopId)
+	}
+	if api.SetMealId != 0 {
+		db = db.Where("rent_computer.set_meal_id = ?", api.SetMealId)
+	}
+	if api.DirectorName != "ALL" {
+		if api.DirectorName == "" {
+			db = db.Where("rent_computer.director_name IS NULL")
+		} else {
+			db = db.Where("rent_computer.director_name = ?", api.DirectorName)
+		}
+	}
+	if api.IsExpire != -1 {
+		db = db.Where("rent_computer.is_expire = ?", api.IsExpire)
+	}
 	_ = db.Count(&total).Error
 	return total
 }
@@ -146,6 +174,7 @@ func (s *ServiceRentComputer) AddRentComputer(requestCoding request.ComputerRequ
 	computer.IsExpire = requestCoding.IsExpire
 	computer.SetMealId = requestCoding.SetMealId
 	computer.IsOffShelf = requestCoding.IsOffShelf
+	computer.DirectorName = requestCoding.DirectorName
 	computer.CreateTime = time.Now().Format("2006-01-02 15:04:05")
 	computer.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
 	//key := codeListCacheKey
@@ -156,12 +185,13 @@ func (s *ServiceRentComputer) AddRentComputer(requestCoding request.ComputerRequ
 func (s *ServiceRentComputer) GetRentComputerById(id int) (computerShop response.ComputerStatisticsReply2, err error) {
 	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
 	var api response.ComputerStatisticsReply2
-	db = db.Select("rent_computer.id,rent_computer.update_time,rent_computer.create_time,rent_computer.pc_num,rent_computer.set_meal_id," +
+	db = db.Select("rent_computer.id,rent_computer.update_time,rent_computer.create_time,rent_computer.pc_num,rent_computer.set_meal_id,rent_computer.director_name," +
 		"rent_computer.pc_name,rent_computer.shop_id,rent_computer.rent_start,rent_computer.rent_duration,rent_computer.is_off_shelf,rent_computer.rent_end," +
 		"rent_computer.remark,rent_computer.todesk_id,rent_computer.todesk_password,rent_computer.sunflower_id,rent_computer.sunflower_password,rent_computer.rent_price_used,rent_computer.is_expire," +
 		"s.name as shop_name, r.name as set_meal_name,r.rent_price,r.price_type,r.rent_price_day")
 	db = db.Joins("left join rent_computer_shop s on s.id = rent_computer.shop_id")
 	db = db.Joins("left join rent_set_meal r on r.id = rent_computer.set_meal_id")
+	//db = db.Joins("left join responsible_person p on p.name = rent_computer.director_name")
 	err = db.Where("rent_computer.id = ?", id).Order(id).Limit(1).Find(&api).Error
 	if err != nil {
 		return
@@ -183,12 +213,13 @@ func (s *ServiceRentComputer) GetRentComputerById(id int) (computerShop response
 	computerShop.SetMealId = api.SetMealId
 	computerShop.PriceType = api.PriceType
 	computerShop.IsOffShelf = api.IsOffShelf
-	global.GVA_LOG.Info(strconv.Itoa(api.IsOffShelf))
-	global.GVA_LOG.Info(strconv.Itoa(computerShop.IsOffShelf))
+	//global.GVA_LOG.Info(strconv.Itoa(api.IsOffShelf))
+	//global.GVA_LOG.Info(strconv.Itoa(computerShop.IsOffShelf))
 	computerShop.ShopName = api.ShopName
 	computerShop.SetMealName = api.SetMealName
 	computerShop.Remark = api.Remark
 	computerShop.ShopId = api.ShopId
+	computerShop.DirectorName = api.DirectorName
 	computerShop.UpdateTime = api.UpdateTime
 	computerShop.CreateTime = api.CreateTime
 	return
@@ -215,6 +246,148 @@ func (s *ServiceRentComputer) DeleteRentComputerById(api rentComputer.RentComput
 	return global.GVA_DB.Delete(&entity).Error
 }
 
+// RenewRentComputer 租机续费
+func (s *ServiceRentComputer) RenewRentComputer(api request.RenewRentComputerRequest) (err error) {
+	var info rentComputer.RentComputer
+	if errors.Is(global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ?", api.PcId).First(&info).Error, gorm.ErrRecordNotFound) {
+		return err
+	}
+	//global.GVA_LOG.Info(info.PcNum)
+	remark := time.Now().Format("2006-01-02 15:04:05") + ",租机编号" + api.PcNum + "续费" + strconv.Itoa(api.Day) + "天,续费至" + api.RentRenew + ";\n"
+	global.GVA_LOG.Info(remark)
+	api.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	nowUnix := time.Now().Unix()
+	rentRenew, _ := time.ParseInLocation("2006-01-02 15:04:05", api.RentRenew, time.Local)
+	if rentRenew.Unix() < nowUnix {
+		api.IsExpire = 1
+	} else if rentRenew.Unix()-nowUnix <= 24*60*60 {
+		api.IsExpire = 2
+	} else {
+		api.IsExpire = 0
+	}
+	//global.GVA_LOG.Info(strconv.Itoa(api.IsExpire))
+	api.Remark = info.Remark + remark
+	var updateInfo rentComputer.RentComputer
+	updateInfo.UpdateTime = api.UpdateTime
+	updateInfo.Id = api.PcId
+	updateInfo.IsExpire = api.IsExpire
+	updateInfo.RentDuration = info.RentDuration + api.Day
+	updateInfo.RentEnd = api.RentRenew
+	updateInfo.Remark = api.Remark
+	err = global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ?", api.PcId).Updates(updateInfo).Error
+	return err
+}
+
+// RentingOutRentComputer 租机退租
+func (s *ServiceRentComputer) RentingOutRentComputer(api request.RentingOutRentComputerRequest) (errMessage string, err error, okMessage string) {
+	var info rentComputer.RentComputer
+	if errors.Is(global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ? ", api.PcId).First(&info).Error, gorm.ErrRecordNotFound) {
+		return "待退租的租机编号不存在", err, ""
+	}
+	nowUnix := time.Now().Unix()
+	now := time.Now().Format("2006-01-02 15:04:05")
+	const oneDayUnix = 24 * 60 * 60
+	rentEnd1, _ := time.ParseInLocation("2006-01-02 15:04:05", info.RentEnd, time.Local)
+	rentEnd2, _ := time.ParseInLocation("2006-01-02 15:04:05", api.RentEnd, time.Local)
+	if rentEnd1.Unix() < nowUnix {
+		return "待退租的租机已到期", err, ""
+	}
+	surplusDay := math.Ceil(float64((rentEnd1.Unix() - rentEnd2.Unix()) / oneDayUnix))
+	remark := now + ",租机编号" + info.PcNum + "退租,剩余" + strconv.Itoa(int(surplusDay)) + "天,"
+
+	for i, v := range api.AddList {
+		//global.GVA_LOG.Info(v.PcNum)
+		//global.GVA_LOG.Info(strconv.Itoa(v.AddDay))
+		var infoTemp rentComputer.RentComputer
+		if errors.Is(global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("pc_num = ? and  shop_id = ?", v.PcNum, info.ShopId).First(&infoTemp).Error, gorm.ErrRecordNotFound) {
+			return "增加时间的租机编号不存在", err, ""
+		}
+		if i < len(api.AddList) {
+			remark += "编号" + v.PcNum + "加" + strconv.Itoa(v.AddDay) + "天,"
+		} else {
+			remark += "编号" + v.PcNum + "加" + strconv.Itoa(v.AddDay) + "天;\n"
+		}
+
+		infoTemp.UpdateTime = now
+		infoTemp.RentDuration = infoTemp.RentDuration + v.AddDay
+		rentEndTemp, _ := time.ParseInLocation("2006-01-02 15:04:05", infoTemp.RentEnd, time.Local)
+		infoTemp.RentEnd = rentEndTemp.AddDate(0, 0, v.AddDay).Format("2006-01-02 15:04:05")
+		err = global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ?", infoTemp.Id).Updates(infoTemp).Error
+		if err != nil {
+			return "增加时间的租机信息修改失败!", err, ""
+		}
+	}
+	//修改退租机器信息
+	info.RentEnd = api.RentEnd
+	info.RentDuration = info.RentDuration - int(surplusDay)
+	info.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	info.Remark = info.Remark + remark
+	err = global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ?", info.Id).Updates(info).Error
+	if err != nil {
+		return "退租机器信息修改失败!", err, ""
+	}
+
+	return "", err, remark
+}
+
+// ReplaceNumRentComputer 租机换编号
+func (s *ServiceRentComputer) ReplaceNumRentComputer(api request.ReplaceNumRentComputerRequest) (errMessage string, err error, okMessage string) {
+	var infoOld rentComputer.RentComputer
+	if errors.Is(global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("pc_num = ? and shop_id = ?", api.PcNumOld, api.ShopId).First(&infoOld).Error, gorm.ErrRecordNotFound) {
+		return "待更换的租机编号不存在", err, ""
+	}
+	nowUnix := time.Now().Unix()
+	const oneDayUnix = 24 * 60 * 60
+	rentEndOld, _ := time.ParseInLocation("2006-01-02 15:04:05", infoOld.RentEnd, time.Local)
+	if rentEndOld.Unix() < nowUnix {
+		return "待更换的租机已到期", err, ""
+	}
+	var infoNew rentComputer.RentComputer
+	if !errors.Is(global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("pc_num = ? and shop_id = ?", api.PcNumNew, api.ShopId).First(&infoNew).Error, gorm.ErrRecordNotFound) {
+		return "要更换的租机编号已存在,不允许更换", err, ""
+	}
+	remark := time.Now().Format("2006-01-02 15:04:05") + ",租机编号" + api.PcNumOld + "更换为租机编号" + api.PcNumNew + ";\n"
+	okMessage = remark
+	rentDurationNew := math.Ceil(float64((rentEndOld.Unix() - nowUnix) / oneDayUnix))
+	infoNew.PcNum = api.PcNumNew
+	infoNew.PcName = api.PcNumNew
+	infoNew.ShopId = api.ShopId
+	infoNew.RentStart = time.Now().Format("2006-01-02 15:04:05")
+	infoNew.RentDuration = int(rentDurationNew)
+	infoNew.RentEnd = infoOld.RentEnd
+	infoNew.Remark = remark
+	infoNew.TodeskId = ""
+	infoNew.TodeskPassword = ""
+	infoNew.SunflowerId = ""
+	infoNew.SunflowerPassword = ""
+	infoNew.RentPriceUsed = 0
+	infoNew.IsExpire = 0
+	infoNew.SetMealId = infoOld.SetMealId
+	infoNew.IsOffShelf = 0
+	infoNew.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+	infoNew.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	// 修改旧编号信息
+	if infoOld.Remark != "" {
+		remark = infoOld.Remark + ";" + remark
+	}
+	rentStartOld, _ := time.ParseInLocation("2006-01-02 15:04:05", infoOld.RentStart, time.Local)
+	rentDurationOld := math.Ceil(float64((rentEndOld.Unix() - rentStartOld.Unix()) / oneDayUnix))
+	infoOld.RentDuration = int(rentDurationOld)
+	infoOld.RentEnd = time.Now().Format("2006-01-02 15:04:05")
+	infoOld.Remark = remark
+	infoOld.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	err = global.GVA_DB.Model(&rentComputer.RentComputer{}).Where("id = ?", infoOld.Id).Updates(infoOld).Error
+	if err != nil {
+		return "旧编号租机修改失败!", err, ""
+	}
+	// 插入新编号至数据库
+	err = global.GVA_DB.Create(&infoNew).Error
+	if err != nil {
+		return "新编号租机创建失败!", err, ""
+	}
+	return "", err, okMessage
+}
+
 func (exa *ServiceRentComputer) ParseExcel2InfoList(filePath string) (err error) {
 	skipHeader := true
 	fixedHeader := []string{"租机编码", "供应商", "所属套餐", "套餐类型", "起租日", "到期日", "todesk号", "todesk密码", "向日葵号", "向日葵密码"}
@@ -283,9 +456,9 @@ func (exa *ServiceRentComputer) ParseExcel2InfoList(filePath string) (err error)
 		if flagShopId == false || flagSetMealName == false {
 			return errors.New("供应商错误")
 		}
-
-		rentStart, _ := time.ParseInLocation("2006-01-02 15:04:05", row[4]+" 00:00:00", time.Local)
-		rentEnd, _ := time.ParseInLocation("2006-01-02 15:04:05", row[5]+" 00:00:00", time.Local)
+		// 时间统一设置为日期+12:00:00
+		rentStart, _ := time.ParseInLocation("2006-01-02 15:04:05", row[4]+" 12:00:00", time.Local)
+		rentEnd, _ := time.ParseInLocation("2006-01-02 15:04:05", row[5]+" 12:00:00", time.Local)
 		//global.GVA_LOG.Info(strconv.FormatInt(rentStart.Unix(), 10))
 		//global.GVA_LOG.Info(strconv.FormatInt(rentEnd.Unix(), 10))
 		c.RentStart = row[4] + " 00:00:00"
@@ -356,12 +529,12 @@ func (exa *ServiceRentComputer) compareStrSlice(a, b []string) bool {
 	return true
 }
 
-// CheckIsExpire 定时检查是否有电脑到期,修改租机状态/*
+// CheckIsExpire 定时检查是否有电脑到期,修改租机状态
 func (s *ServiceRentComputer) CheckIsExpire() {
 	global.GVA_LOG.Info("检查是否有电脑到期开始执行:" + time.Now().Format("2006-01-02 15:04:05"))
 	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
 	//SELECT pc_num,rent_start,rent_end,is_expire FROM shuyou_rent_computer
-	db = db.Where("is_off_shelf = 0")
+	//db = db.Where("is_off_shelf = 0")
 	var computers []*rentComputer.RentComputer
 	err := db.Order("id").Find(&computers).Error
 	if err != nil {
@@ -411,6 +584,84 @@ func (s *ServiceRentComputer) CheckIsExpire() {
 	return
 }
 
+// CreateRentComputerLedger 定时生成今日租机台账表(财务)
+func (s *ServiceRentComputer) CreateRentComputerLedger() {
+	global.GVA_LOG.Info("定时生成今日租机台账表开始执行:" + time.Now().Format("2006-01-02 15:04:05"))
+	//查询当前所有在租电脑
+	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
+	var computers []*rentComputer.RentComputerSetMeal
+	db = db.Select("rent_computer.pc_num, rent_computer.pc_name,rent_computer.shop_id, rent_computer.rent_start, rent_computer.rent_duration, rent_computer.rent_end, rent_computer.is_expire, " +
+		"r.rent_price,r.rent_price_day,rent_computer.set_meal_id")
+	db = db.Joins("left join rent_set_meal r on r.id = rent_computer.set_meal_id")
+	db = db.Where("rent_computer.is_expire != 1")
+	err := db.Order("rent_computer.id").Find(&computers).Error
+	if err != nil {
+		global.GVA_LOG.Error("定时生成今日租机台账表执行失败:"+time.Now().Format("2006-01-02 15:04:05"), zap.Error(err))
+		return
+	}
+	//查询昨日租机台账表中的rent_price_used_then参数
+	var computersYest []*rentComputer.RentComputerLedger
+	dbYest := global.GVA_DB.Model(&rentComputer.RentComputerLedger{})
+	dbYest = dbYest.Select("rent_price_used_then").Order("id")
+	err = dbYest.Find(&computersYest).Error
+	if err != nil {
+		global.GVA_LOG.Error("定时生成今日租机台账表执行失败,查询昨日数据失败:"+time.Now().Format("2006-01-02 15:04:05"), zap.Error(err))
+		return
+	}
+	nowTime := time.Now().Format("2006-01-02 15:04:05")
+	nowDate := time.Now().Format("2006-01-02")
+	var insertInfos []rentComputer.RentComputerLedger
+	for _, computer := range computers {
+		var info rentComputer.RentComputerLedger
+		info.UpdateTime = nowTime
+		info.CreateTime = nowTime
+		info.NewDate = nowDate
+		info.PcNum = computer.PcNum
+		info.PcName = computer.PcName
+		info.ShopId = computer.ShopId
+		info.RentStartThen = computer.RentStart
+		info.RentDurationThen = computer.RentDuration
+		info.RentEndThen = computer.RentEnd
+		info.RentPriceThen = computer.RentPrice
+		info.RentPriceDayThen = computer.RentPriceDay
+		info.IsExpire = computer.IsExpire
+		info.SetMealId = computer.SetMealId
+		info.Remark = computer.Remark
+
+		flag := false
+		for _, yest := range computersYest {
+			if info.PcNum == yest.PcNum {
+				flag = true
+				info.RentPriceUsedThen = yest.RentPriceUsedThen + computer.RentPriceDay
+				break
+			}
+		}
+		if flag == false {
+			info.RentPriceUsedThen = computer.RentPriceDay
+		}
+		if !errors.Is(global.GVA_DB.Where("pc_num = ? and shop_id = ? and new_date = ?", computer.PcNum, computer.ShopId, nowDate).First(&rentComputer.RentComputerLedger{}).Error, gorm.ErrRecordNotFound) {
+			// 已存在,更新
+			err = global.GVA_DB.Model(&rentComputer.RentComputerLedger{}).Where("pc_num = ? and shop_id = ? and new_date = ?", computer.PcNum, computer.ShopId, nowDate).Updates(info).Error
+			if err != nil {
+				global.GVA_LOG.Error("定时生成今日租机台账表执行失败,更新数据失败:"+time.Now().Format("2006-01-02 15:04:05"), zap.Error(err))
+				return
+			}
+		} else {
+			insertInfos = append(insertInfos, info)
+		}
+
+	}
+	if insertInfos != nil {
+		err = global.GVA_DB.Create(&insertInfos).Error
+		if err != nil {
+			global.GVA_LOG.Error("定时生成今日租机台账表执行失败,插入数据失败:"+time.Now().Format("2006-01-02 15:04:05"), zap.Error(err))
+			return
+		}
+	}
+	global.GVA_LOG.Info("定时生成今日租机台账表执行成功:" + time.Now().Format("2006-01-02 15:04:05"))
+	return
+}
+
 // SubDays 计算日期相差多少天
 // 返回值day>0, t1晚于t2; day<0, t1早于t2
 func SubDays(t1, t2 time.Time) (day int) {

+ 155 - 0
service/rentComputer/rent_computer_ledger.go

@@ -0,0 +1,155 @@
+package rentComputer
+
+import (
+	"context"
+	"fmt"
+	"github.com/xuri/excelize/v2"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/rentComputer"
+	"log-server/model/rentComputer/request"
+	"log-server/model/rentComputer/response"
+	"time"
+)
+
+type ServiceRentComputerLedger struct {
+}
+
+func (service *ServiceRentComputerLedger) RentComputerLedgerList(ctx context.Context, api rentComputer.RentComputerLedger, info request.PageInfo, order string, desc bool) ([]*response.RentComputerLedgerResponse, int64, error) {
+
+	db := global.GVA_DB.Model(&rentComputer.RentComputerLedger{})
+	db = db.Select("rent_computer_ledger.id,rent_computer_ledger.update_time,rent_computer_ledger.create_time,rent_computer_ledger.pc_num,rent_computer_ledger.new_date,rent_computer_ledger.set_meal_id," +
+		"rent_computer_ledger.pc_name,rent_computer_ledger.shop_id,rent_computer_ledger.rent_start_then,rent_computer_ledger.rent_duration_then,rent_computer_ledger.rent_price_then,rent_computer_ledger.rent_end_then," +
+		"rent_computer_ledger.remark,rent_computer_ledger.rent_price_used_then,rent_computer_ledger.is_expire,rent_computer_ledger.rent_price_day_then,rent_computer_ledger.set_meal_id," +
+		"s.name as shop_name, r.name as set_meal_name")
+	db = db.Joins("left join rent_computer_shop s on s.id = rent_computer_ledger.shop_id")
+	db = db.Joins("left join rent_set_meal r on r.id = rent_computer_ledger.set_meal_id")
+	if api.PcNum != "" {
+		db = db.Where("rent_computer_ledger.pc_num = ?", api.PcNum)
+	}
+	if api.ShopId != 0 {
+		db = db.Where("rent_computer_ledger.shop_id = ?", api.ShopId)
+	}
+	if api.SetMealId != 0 {
+		db = db.Where("rent_computer_ledger.set_meal_id = ?", api.SetMealId)
+	}
+	//if api.IsExpire != -1 {
+	//	db = db.Where("rent_computer_ledger.is_expire = ?", api.IsExpire)
+	//}
+	if api.NewDate != "" {
+		db = db.Where("rent_computer_ledger.new_date = ?", api.NewDate)
+	} else {
+		yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
+		db = db.Where("rent_computer_ledger.new_date = ?", yesterday)
+	}
+
+	var total int64
+	err := db.Count(&total).Error
+	//if err != nil {
+	//	return nil, 0, err
+	//}
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	//var statisticsLogs []*log.LogComputer
+	var ledgerComputers []*response.RentComputerLedgerResponse
+	db = db.Limit(limit).Offset(offset)
+	if order != "" {
+		var OrderStr string
+		// 设置有效排序key 防止sql注入
+		// 感谢 Tom4t0 提交漏洞信息
+		orderMap := make(map[string]bool, 3)
+		orderMap["pc_num"] = true
+		//orderMap["game_id"] = true
+		//orderMap["operator"] = true
+		if orderMap[order] {
+			if desc {
+				OrderStr = order + " desc"
+			} else {
+				OrderStr = order
+			}
+		} else { // didn't matched any order key in `orderMap`
+			global.GVA_LOG.Error("获取失败!", zap.Error(err))
+			return ledgerComputers, total, err
+		}
+		err = db.Order(OrderStr).Find(&ledgerComputers).Error
+	} else {
+		err = db.Order("id").Find(&ledgerComputers).Error
+	}
+	if err != nil {
+		return nil, 0, err
+	}
+	var infos []*response.RentComputerLedgerResponse
+
+	for _, one := range ledgerComputers {
+		info := new(response.RentComputerLedgerResponse)
+		info.Id = one.Id
+		info.UpdateTime = one.UpdateTime
+		info.CreateTime = one.CreateTime
+		info.PcNum = one.PcNum
+		info.PcName = one.PcName
+		info.ShopId = one.ShopId
+		info.Remark = one.Remark
+		info.IsExpire = one.IsExpire
+		info.SetMealId = one.SetMealId
+		info.ShopName = one.ShopName
+		info.SetMealName = one.SetMealName
+		info.RentPriceUsedThen = one.RentPriceUsedThen
+		info.RentStartThen = one.RentStartThen
+		info.RentEndThen = one.RentEndThen
+		info.RentPriceDayThen = one.RentPriceDayThen
+		info.NewDate = one.NewDate
+		info.RentPriceThen = one.RentPriceThen
+		info.RentDurationThen = one.RentDurationThen
+		infos = append(infos, info)
+	}
+	return infos, total, err
+}
+
+func (service *ServiceRentComputerLedger) GetRentComputerLedgerNum(ctx context.Context, api rentComputer.RentComputerLedger) int64 {
+	var total int64
+
+	db := global.GVA_DB.Model(&rentComputer.RentComputerLedger{})
+	db = db.Distinct("id")
+	if api.PcNum != "" {
+		db = db.Where("rent_computer_ledger.pc_num = ?", api.PcNum)
+	}
+	if api.ShopId != 0 {
+		db = db.Where("rent_computer_ledger.shop_id = ?", api.ShopId)
+	}
+	if api.SetMealId != 0 {
+		db = db.Where("rent_computer_ledger.set_meal_id = ?", api.SetMealId)
+	}
+	if api.NewDate != "" {
+		db = db.Where("rent_computer_ledger.new_date = ?", api.NewDate)
+	} else {
+		yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
+		db = db.Where("rent_computer_ledger.new_date = ?", yesterday)
+	}
+	//db = db.Where("is_expire != 1")
+	_ = db.Count(&total).Error
+	return total
+}
+
+func (service *ServiceRentComputerLedger) ParseInfoList2Excel(infoList []*response.RentComputerLedgerResponse, filePath string) error {
+	excel := excelize.NewFile()
+	_ = excel.SetSheetRow("Sheet1", "A1", &[]string{"日期", "供应商", "编号", "起租日期", "到期日期", "租期", "套餐", "价格", "天租金", "已产生租金", "备注"})
+
+	for i, one := range infoList {
+		axis := fmt.Sprintf("A%d", i+2)
+		_ = excel.SetSheetRow("Sheet1", axis, &[]interface{}{
+			one.NewDate,
+			one.ShopName,
+			one.PcNum,
+			one.RentStartThen,
+			one.RentEndThen,
+			one.RentDurationThen,
+			one.SetMealName,
+			one.RentPriceThen,
+			one.RentPriceDayThen,
+			one.RentPriceUsedThen,
+			one.Remark,
+		})
+	}
+	err := excel.SaveAs(filePath)
+	return err
+}

+ 85 - 0
service/system/sys_robot.go

@@ -0,0 +1,85 @@
+package system
+
+import (
+	"encoding/json"
+	"log-server/global"
+	"log-server/utils"
+	"strconv"
+	"time"
+)
+
+type RobotService struct{}
+
+type SendMsg struct {
+	MsgType  string `json:"msgtype"`
+	Markdown struct {
+		Content string `json:"content"`
+	} `json:"markdown"`
+}
+
+func (robotService *RobotService) PostRobotToEnterpriseWeChatByMarkdown(url string, content string) (result []byte, err error) {
+	var sendMsg SendMsg
+	sendMsg.MsgType = "markdown"
+	sendMsg.Markdown.Content = content
+	result, err = utils.HttpPost(url, sendMsg)
+	return
+}
+
+// SyncJfDevicesMessage 定时同步机房设备信息
+func (robotService *RobotService) SyncJfDevicesMessage() {
+	//机房现在就开了第15架和第16架设备
+	//rackArr := []int{15, 16}
+	rackArr := map[int]float64{
+		//设备架号:该架正常率标准值
+		15: 0.6,
+		16: 0.6,
+	}
+	content := ">#### **机房设备预警** (" + time.Now().Format("2006-01-02 15:04:05") + "):\n"
+	var keyWord string
+	for rack, abnormalRate := range rackArr {
+		result, err := robotService.RequestJfDevicesState(rack)
+		if err != nil {
+			global.GVA_LOG.Error("获取机房设备信息失败,设备可能断电,请注意排查!!!")
+			keyWord = "获取机房设备信息失败,设备可能断电,请注意排查!!!,错误信息:" + err.Error()
+			break
+		}
+		if string(result) != "null" {
+			var data [][]int
+			err := json.Unmarshal(result, &data)
+			if err != nil {
+				return
+			}
+			NumTotal := len(data)
+			NumGood := 0
+			for _, v := range data {
+				if v[2] == 3 {
+					NumGood += 1
+				}
+			}
+			//global.GVA_LOG.Info(strconv.Itoa(NumTotal))
+			//global.GVA_LOG.Info(strconv.Itoa(NumGood))numIntoGame * numStartGame / 1e6
+			rate := float64(NumGood) / float64(NumTotal)
+
+			if rate < abnormalRate {
+				keyWord += "\n 机房第" + strconv.Itoa(rack) + "架设备正常率为:" + strconv.FormatFloat(rate, 'f', 2, 64) + ",设备正常率低,建议维护重启 \n"
+			}
+			//global.GVA_LOG.Info(keyWord)
+		}
+	}
+	if keyWord != "" {
+		content += keyWord
+		url := global.GVA_CONFIG.SendUrl.KeyWordSendUrl
+		_, _ = robotService.PostRobotToEnterpriseWeChatByMarkdown(url, content)
+	}
+	return
+}
+
+// RequestJfDevicesState 获取机房设备信息
+func (robotService *RobotService) RequestJfDevicesState(rack int) (result []byte, err error) {
+	jfUrl := "http://182.150.53.148:6007/v1/manage/chart"
+	jfParams := map[string]string{
+		"Rack": strconv.Itoa(rack),
+	}
+	result, err = utils.HttpGet(jfUrl, jfParams)
+	return
+}

+ 21 - 18
service/typeManage/tm_responsiblePerson.go

@@ -20,11 +20,10 @@ func RandomString(n int) string {
 	return string(b)
 }
 
-
 type ResponsiblePersonService struct {
 }
 
-//创建负责人
+// 创建负责人
 func (r *ResponsiblePersonService) CreateResponsiblePerson(person typeManage.ResponsiblePerson) (err error) {
 	//先查找是否存在同名员工
 	err = global.GVA_DB.Table("responsible_person").Where("name = ? and mobile_phone_number = ?", person.Name, person.MobilePhoneNumber).First(&typeManage.ResponsiblePerson{}).Error
@@ -76,8 +75,7 @@ func (r *ResponsiblePersonService) CreateResponsiblePerson(person typeManage.Res
 	return global.GVA_DB.Table("responsible_person").Omit("create_time", "update_time").Create(&person).Error
 }
 
-
-//删除负责人
+// 删除负责人
 func (r *ResponsiblePersonService) DeleteResponsiblePerson(person typeManage.ResponsiblePerson) (err error) {
 	var entity typeManage.ResponsiblePerson
 	err = global.GVA_DB.Table("responsible_person").Where("id = ?", person.Id).First(&entity).Error
@@ -87,15 +85,14 @@ func (r *ResponsiblePersonService) DeleteResponsiblePerson(person typeManage.Res
 	return global.GVA_DB.Table("responsible_person").Delete(&entity).Error
 }
 
-//批量删除
+// 批量删除
 func (r *ResponsiblePersonService) DeleteResponsiblePersonsByIds(ids request.IdsReq) (err error) {
 	err = global.GVA_DB.Table("responsible_person").Delete(&[]typeManage.ResponsiblePerson{}, "id in ?", ids.Ids).Error
 	return err
 }
 
-
-//更改记录
-func (r *ResponsiblePersonService) UpdateResponsiblePerson(person typeManage.ResponsiblePerson) (err error)  {
+// 更改记录
+func (r *ResponsiblePersonService) UpdateResponsiblePerson(person typeManage.ResponsiblePerson) (err error) {
 	err = global.GVA_DB.Table("responsible_person").Where("id != ? and name = ?", person.Id, person.Name).First(&typeManage.ResponsiblePerson{}).Error
 	if !errors.Is(err, gorm.ErrRecordNotFound) {
 		return errors.New("已存在相同名字,无法更改")
@@ -103,17 +100,14 @@ func (r *ResponsiblePersonService) UpdateResponsiblePerson(person typeManage.Res
 	return global.GVA_DB.Table("responsible_person").Updates(&person).Error
 }
 
-
-//通过id查询负责人
-func (r *ResponsiblePersonService) GetResponsiblePersonById(id int) (person typeManage.ResponsiblePerson, err error)  {
+// 通过id查询负责人
+func (r *ResponsiblePersonService) GetResponsiblePersonById(id int) (person typeManage.ResponsiblePerson, err error) {
 	err = global.GVA_DB.Table("responsible_person").Where("id = ?", id).First(&person).Error
 	return
 }
 
-
-
-//条件查询负责人
-func(r *ResponsiblePersonService) GetResponsiblePerson(person typeManage.ResponsiblePerson, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
+// 条件查询负责人
+func (r *ResponsiblePersonService) GetResponsiblePerson(person typeManage.ResponsiblePerson, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
 	//获取分页数据
 	limit := info.PageSize
 	offset := (info.Page - 1) * info.PageSize
@@ -122,16 +116,16 @@ func(r *ResponsiblePersonService) GetResponsiblePerson(person typeManage.Respons
 	var personList []typeManage.ResponsiblePerson
 	//条件查询
 	if person.Name != "" {
-		db.Where("name like ?","%"+person.Name+"%")
+		db.Where("name like ?", "%"+person.Name+"%")
 	}
 	//先过滤在排序
-	if err = db.Count(&total).Error;err != nil{
+	if err = db.Count(&total).Error; err != nil {
 		return personList, total, err
 	} else {
 		//分页
 		db.Limit(limit).Offset(offset)
 		//判断是否有排序字段
-		if order != ""{
+		if order != "" {
 			var orderStr string
 			orderMap := make(map[string]bool, 1)
 			orderMap["create_time"] = true
@@ -155,3 +149,12 @@ func(r *ResponsiblePersonService) GetResponsiblePerson(person typeManage.Respons
 	}
 	return personList, total, err
 }
+
+// GetResponsiblePersonAll 条件查询负责人
+func (r *ResponsiblePersonService) GetResponsiblePersonAll() (list interface{}, err error) {
+	var personList []typeManage.ResponsiblePerson
+	db := global.GVA_DB.Table("responsible_person").Model(&typeManage.ResponsiblePerson{})
+	db.Where("state = 1")
+	err = db.Order("name").Find(&personList).Error
+	return personList, err
+}

BIN
uploads/file/28ca53d2b7bb4aa13549b4022c79dca1_20230215183015.jpg