hsun 2 роки тому
батько
коміт
28b75dc572
52 змінених файлів з 1363 додано та 103 видалено
  1. 4 4
      controller/auth.go
  2. 543 0
      controller/contract/register.go
  3. 4 0
      controller/contract/service.go
  4. 58 0
      controller/crm/company_seller.go
  5. 102 0
      controller/crm/contract.go
  6. 2 2
      controller/resource/video.go
  7. 1 1
      controller/resp/base.go
  8. 6 12
      controller/system/sys_admin.go
  9. 6 6
      controller/system/sys_dept.go
  10. 6 6
      controller/system/sys_menu.go
  11. 6 6
      controller/system/sys_role.go
  12. 3 3
      core/log.go
  13. 2 2
      core/run_server.go
  14. 2 2
      global/global.go
  15. 1 1
      go.mod
  16. 1 1
      init_serve/mysql.go
  17. 1 1
      init_serve/redis.go
  18. 12 4
      init_serve/router.go
  19. 1 1
      main.go
  20. 4 4
      middleware/recover.go
  21. 4 4
      middleware/token.go
  22. 1 1
      middleware/token_no_login.go
  23. 3 3
      models/base/time_base.go
  24. 28 0
      models/crm/company_seller.go
  25. 45 0
      models/crm/constants.go
  26. 106 0
      models/crm/contract.go
  27. 27 0
      models/fms/constants.go
  28. 101 0
      models/fms/contract_invoice.go
  29. 154 0
      models/fms/contract_register.go
  30. 40 0
      models/fms/contract_register_log.go
  31. 5 0
      models/fms/contract_service.go
  32. 2 2
      models/system/sys_admin.go
  33. 2 2
      models/system/sys_dept.go
  34. 2 2
      models/system/sys_menu.go
  35. 2 2
      models/system/sys_role.go
  36. 1 1
      models/system/sys_role_menu.go
  37. 2 2
      models/system/sys_session.go
  38. 1 1
      routers/auth.go
  39. 22 0
      routers/contract.go
  40. 19 0
      routers/crm.go
  41. 1 1
      routers/resource.go
  42. 2 2
      routers/system.go
  43. 2 2
      services/alarm_msg/alarm_msg.go
  44. 5 0
      services/fms/contract_register.go
  45. 2 2
      services/resource/email.go
  46. 4 5
      services/resource/oss.go
  47. 1 1
      services/resource/pdf.go
  48. 3 3
      services/system/sys_admin.go
  49. 3 3
      services/system/sys_dept.go
  50. 3 3
      services/system/sys_menu.go
  51. 2 2
      services/system/sys_role.go
  52. 3 3
      task/task.go

+ 4 - 4
controller/auth.go

@@ -3,10 +3,10 @@ package controller
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/system"
-	systemService "hongze/hrms_api/services/system"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/system"
+	systemService "hongze/fms_api/services/system"
 )
 
 type AuthController struct {

+ 543 - 0
controller/contract/register.go

@@ -0,0 +1,543 @@
+package contract
+
+import (
+	"encoding/json"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/fms"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
+	"time"
+)
+
+// RegisterController 合同登记
+type RegisterController struct{}
+
+// List
+// @Title 合同登记列表
+// @Description 合同登记列表
+// @Param   Keyword			query	string	false	"关键词"
+// @Param   StartDate		query	string	false	"合同开始日期"
+// @Param   EndDate			query	string	false	"合同结束日期"
+// @Param   ServiceType		query	int		false	"套餐类型"
+// @Param   ContractType	query	int		false	"合同类型"
+// @Param   RegisterStatus	query	int		false	"登记状态"
+// @Success 200 {object} fms.ContractRegisterListResp
+// @router /contract/register/list [get]
+func (rg *RegisterController) List(c *gin.Context) {
+	var req fms.ContractRegisterListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+
+	cond := ``
+	pars := make([]interface{}, 0)
+	if req.Keyword != "" {
+		kw := "%" + req.Keyword + "%"
+		cond += ` AND (company_name LIKE ? OR contract_code LIKE ? OR seller_name LIKE ?)`
+		pars = append(pars, kw, kw, kw)
+	}
+	if req.StartDate != "" && req.EndDate != "" {
+		cond += ` AND (start_time >= ? AND end_time <= ?)`
+		pars = append(pars, req.StartDate, req.EndDate)
+	}
+	if req.ServiceType != 0 {
+		cond += ` AND service_type = ?`
+		pars = append(pars, req.ServiceType)
+	}
+	if req.ContractType != 0 {
+		cond += ` AND contract_type = ?`
+		pars = append(pars, req.ContractType)
+	}
+	if req.RegisterStatus != 0 {
+		cond += ` AND register_status = ?`
+		pars = append(pars, req.RegisterStatus)
+	}
+	page := new(base.Page)
+	page.SetPageSize(req.PageSize)
+	page.SetCurrent(req.Current)
+	page.AddOrderItem(base.OrderItem{Column: "create_time", Asc: false})
+
+	ob := new(fms.ContractRegister)
+	total, list, e := ob.PageList(page, cond, pars)
+	if e != nil {
+		resp.FailMsg("获取失败", "获取合同登记列表, Err: "+e.Error(), c)
+		return
+	}
+	respList := make([]*fms.ContractRegisterListResp, 0)
+	for i := range list {
+		// TODO:套餐信息
+		respList = append(respList, &fms.ContractRegisterListResp{
+			ContractRegisterId: list[i].ContractRegisterId,
+			ContractCode:       list[i].ContractCode,
+			CompanyName:        list[i].CompanyName,
+			SellerId:           list[i].SellerId,
+			SellerName:         list[i].SellerName,
+			ContractType:       list[i].ContractType,
+			ContractAmount:     list[i].ContractAmount,
+			InvoicedAmount:     list[i].InvoicedAmount,
+			PaymentAmount:      list[i].PaymentAmount,
+			StartDate:          utils.TimeTransferString(utils.FormatDate, list[i].StartDate),
+			EndDate:            utils.TimeTransferString(utils.FormatDate, list[i].EndDate),
+			SignDate:           utils.TimeTransferString(utils.FormatDate, list[i].SignDate),
+			AgreedPayTime:      list[i].AgreedPayTime,
+			ContractStatus:     list[i].ContractStatus,
+			RegisterStatus:     list[i].RegisterStatus,
+			Remark:             list[i].Remark,
+			CreateTime:         utils.TimeTransferString(utils.FormatDateTime, list[i].CreateTime),
+		})
+	}
+
+	page.SetTotal(total)
+	baseData := new(base.BaseData)
+	baseData.SetPage(page)
+	baseData.SetList(respList)
+	resp.OkData("获取成功", baseData, c)
+}
+
+// Add
+// @Title 新增合同登记
+// @Description 新增合同登记
+// @Param	request  body  fms.ContractRegisterAddReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/register/add [post]
+func (rg *RegisterController) Add(c *gin.Context) {
+	req := new(fms.ContractRegisterAddReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	// 日期校验
+	startDate, e := time.ParseInLocation(utils.FormatDate, req.StartDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同开始日期格式有误", "合同开始日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+	endDate, e := time.ParseInLocation(utils.FormatDate, req.EndDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同结束日期格式有误", "合同结束日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+	signDate, e := time.ParseInLocation(utils.FormatDate, req.SignDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同签订日期格式有误", "合同签订日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+
+	// 是否存在相同合同编号的登记
+	ob := new(fms.ContractRegister)
+	existCond := `contract_code = ?`
+	existPars := make([]interface{}, 0)
+	existPars = append(existPars, req.ContractCode)
+	exist, e := ob.FetchByCondition(existCond, existPars)
+	if e != nil && e != utils.ErrNoRow {
+		resp.FailMsg("操作失败", "获取相同登记号失败, Err: "+e.Error(), c)
+		return
+	}
+	if exist != nil && exist.ContractRegisterId > 0 {
+		resp.Fail("合同编号已存在", c)
+		return
+	}
+
+	nowTime := time.Now().Local()
+	ob.ContractCode = req.ContractCode
+	ob.CrmContractId = req.CrmContractId
+	ob.ContractSource = req.ContractSource
+	ob.CompanyName = req.CompanyName
+	ob.SellerId = req.SellerId
+	ob.SellerName = req.SellerName
+	ob.ContractType = req.ContractType
+	ob.ContractAmount = req.ContractAmount
+	ob.StartDate = startDate
+	ob.EndDate = endDate
+	ob.SignDate = signDate
+	ob.AgreedPayTime = req.AgreedPayTime
+	ob.ContractStatus = req.ContractStatus
+	ob.RegisterStatus = fms.ContractRegisterStatusIng
+	ob.Remark = req.Remark
+	ob.Set()
+
+	// TODO:套餐信息
+	if e = ob.Create(); e != nil {
+		resp.FailMsg("操作失败", "新增合同登记失败, Err:"+e.Error(), c)
+		return
+	}
+
+	// 操作日志
+	go func() {
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+
+		logItem := new(fms.ContractRegisterLog)
+		logItem.ContractRegisterId = ob.ContractRegisterId
+		logItem.AdminId = int(adminInfo.AdminId)
+		logItem.AdminName = adminInfo.AdminName
+		logItem.OpData = opData
+		logItem.OpType = fms.ContractRegisterOpTypeSave
+		logItem.CreateTime = nowTime
+		if e = logItem.Create(); e != nil {
+			return
+		}
+	}()
+	resp.Ok("操作成功", c)
+}
+
+// Edit
+// @Title 编辑合同登记
+// @Description 编辑合同登记
+// @Param	request  body  fms.ContractRegisterEditReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/register/edit [post]
+func (rg *RegisterController) Edit(c *gin.Context) {
+	req := new(fms.ContractRegisterEditReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	// 日期校验
+	startDate, e := time.ParseInLocation(utils.FormatDate, req.StartDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同开始日期格式有误", "合同开始日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+	endDate, e := time.ParseInLocation(utils.FormatDate, req.EndDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同结束日期格式有误", "合同结束日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+	signDate, e := time.ParseInLocation(utils.FormatDate, req.SignDate, time.Local)
+	if e != nil {
+		resp.FailMsg("合同签订日期格式有误", "合同签订日期格式有误, Err: "+e.Error(), c)
+		return
+	}
+
+	ob := new(fms.ContractRegister)
+	item, e := ob.Fetch(req.ContractRegisterId)
+	if e != nil {
+		if e == utils.ErrNoRow {
+			resp.Fail("登记记录不存在或已被删除", c)
+			return
+		}
+		resp.FailMsg("操作失败", "获取合同登记信息失败, Err:"+e.Error(), c)
+		return
+	}
+	// 是否存在相同合同编号的登记
+	existCond := `contract_code = ?`
+	existPars := make([]interface{}, 0)
+	existPars = append(existPars, req.ContractCode)
+	exist, e := ob.FetchByCondition(existCond, existPars)
+	if e != nil && e != utils.ErrNoRow {
+		resp.FailMsg("操作失败", "获取相同登记号失败, Err: "+e.Error(), c)
+		return
+	}
+	if exist != nil && exist.ContractRegisterId > 0 && exist.ContractRegisterId != item.ContractRegisterId {
+		resp.Fail("合同编号已存在", c)
+		return
+	}
+
+	nowTime := time.Now().Local()
+	item.ContractCode = req.ContractCode
+	item.CrmContractId = req.CrmContractId
+	item.ContractSource = req.ContractSource
+	item.CompanyName = req.CompanyName
+	item.SellerId = req.SellerId
+	item.SellerName = req.SellerName
+	item.ContractType = req.ContractType
+	item.ContractAmount = req.ContractAmount
+	item.StartDate = startDate
+	item.EndDate = endDate
+	item.SignDate = signDate
+	item.AgreedPayTime = req.AgreedPayTime
+	item.ContractStatus = req.ContractStatus
+	item.RegisterStatus = fms.ContractRegisterStatusIng
+	item.Remark = req.Remark
+	item.ModifyTime = nowTime
+	updateCols := []string{
+		"ContractCode", "CrmContractId", "ContractSource", "CompanyName", "SellerId", "SellerName",
+		"ContractType", "ContractAmount", "StartDate", "EndDate", "SignDate", "AgreedPayTime", "ContractStatus",
+		"RegisterStatus", "Remark", "ModifyTime",
+	}
+	if e = item.Update(updateCols); e != nil {
+		resp.FailMsg("操作失败", "更新合同登记失败, Err: "+e.Error(), c)
+		return
+	}
+
+	// TODO:套餐信息
+
+	// TODO:校验金额-是否修改状态
+
+	// 操作日志
+	go func() {
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+
+		logItem := new(fms.ContractRegisterLog)
+		logItem.ContractRegisterId = item.ContractRegisterId
+		logItem.AdminId = int(adminInfo.AdminId)
+		logItem.AdminName = adminInfo.AdminName
+		logItem.OpData = opData
+		logItem.OpType = fms.ContractRegisterOpTypeSave
+		logItem.CreateTime = nowTime
+		if e = logItem.Create(); e != nil {
+			return
+		}
+	}()
+	resp.Ok("操作成功", c)
+}
+
+// Del
+// @Title 删除合同登记
+// @Description 删除合同登记
+// @Param	request  body  fms.ContractRegisterDelReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/register/del [post]
+func (rg *RegisterController) Del(c *gin.Context) {
+	req := new(fms.ContractRegisterDelReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	ob := new(fms.ContractRegister)
+	item, e := ob.Fetch(req.ContractRegisterId)
+	if e != nil {
+		if e == utils.ErrNoRow {
+			resp.Fail("合同登记不存在或已被删除", c)
+			return
+		}
+		resp.FailMsg("获取合同登记失败", "Err:"+e.Error(), c)
+		return
+	}
+	nowTime := time.Now().Local()
+	item.IsDeleted = 1
+	item.ModifyTime = nowTime
+	updateCols := []string{"IsDeleted", "ModifyTime"}
+	if e = item.Update(updateCols); e != nil {
+		resp.FailMsg("操作失败", "更新合同登记失败, Err:"+e.Error(), c)
+		return
+	}
+
+	// 操作日志
+	go func() {
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+
+		logItem := new(fms.ContractRegisterLog)
+		logItem.ContractRegisterId = req.ContractRegisterId
+		logItem.AdminId = int(adminInfo.AdminId)
+		logItem.AdminName = adminInfo.AdminName
+		logItem.OpData = opData
+		logItem.OpType = fms.ContractRegisterOpTypeDel
+		logItem.CreateTime = nowTime
+		if e = logItem.Create(); e != nil {
+			return
+		}
+	}()
+
+	resp.Ok("操作成功", c)
+}
+
+// 查看详情
+func (rg *RegisterController) Detail(c *gin.Context) {
+
+}
+
+// UpdateStatus
+// @Title 修改合同状态
+// @Description 修改合同状态
+// @Param	request  body  fms.ContractRegisterUpdateStatusReq  true "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/register/update_status [post]
+func (rg *RegisterController) UpdateStatus(c *gin.Context) {
+	req := new(fms.ContractRegisterUpdateStatusReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	ob := new(fms.ContractRegister)
+	item, e := ob.Fetch(req.ContractRegisterId)
+	if e != nil {
+		if e == utils.ErrNoRow {
+			resp.Fail("合同登记不存在或已被删除", c)
+			return
+		}
+		resp.FailMsg("获取合同登记失败", "Err:"+e.Error(), c)
+		return
+	}
+	nowTime := time.Now().Local()
+	item.ContractStatus = req.ContractStatus
+	item.ModifyTime = nowTime
+	updateCols := []string{"ContractStatus", "ModifyTime"}
+	if e = item.Update(updateCols); e != nil {
+		resp.FailMsg("操作失败", "更新合同登记失败, Err:"+e.Error(), c)
+		return
+	}
+
+	// 操作日志
+	go func() {
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+
+		logItem := new(fms.ContractRegisterLog)
+		logItem.ContractRegisterId = req.ContractRegisterId
+		logItem.AdminId = int(adminInfo.AdminId)
+		logItem.AdminName = adminInfo.AdminName
+		logItem.OpData = opData
+		logItem.OpType = fms.ContractRegisterOpTypeStatus
+		logItem.CreateTime = nowTime
+		if e = logItem.Create(); e != nil {
+			return
+		}
+	}()
+
+	resp.Ok("操作成功", c)
+}
+
+// 导出
+func (rg *RegisterController) Export(c *gin.Context) {
+
+}
+
+// Invoice
+// @Title 开票/到款登记
+// @Description 开票/到款登记
+// @Param	request  body  fms.ContractInvoiceSaveReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/register/invoice [post]
+func (rg *RegisterController) Invoice(c *gin.Context) {
+	req := new(fms.ContractInvoiceSaveReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	newInvoice := make([]*fms.ContractInvoice, 0)
+	if len(req.AmountList) > 0 {
+		for i := range req.AmountList {
+			if req.AmountList[i].Amount <= 0 {
+				resp.Fail("登记金额有误", c)
+				return
+			}
+			if req.AmountList[i].InvoiceDate == "" {
+				resp.Fail("请选择日期", c)
+				return
+			}
+			t, e := time.ParseInLocation(utils.FormatDate, req.AmountList[i].InvoiceDate, time.Local)
+			if e != nil {
+				resp.FailData("日期格式有误", "Err:"+e.Error(), c)
+				return
+			}
+			v := &fms.ContractInvoice{
+				ContractRegisterId: req.ContractRegisterId,
+				Amount:             req.AmountList[i].Amount,
+				InvoiceType:        req.InvoiceType,
+				InvoiceDate:        t,
+				AdminId:            int(adminInfo.AdminId),
+				AdminName:          adminInfo.AdminName,
+			}
+			v.Set()
+			newInvoice = append(newInvoice, v)
+		}
+	}
+
+	// 删除并新增登记
+	ob := new(fms.ContractInvoice)
+	if e := ob.DeleteAndCreateNewInvoice(req.ContractRegisterId, req.InvoiceType, newInvoice); e != nil {
+		resp.FailData("日期格式有误", "Err:"+e.Error(), c)
+		return
+	}
+
+	// 操作日志
+	go func() {
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+		opType := fms.ContractRegisterOpTypeInvoice
+		if req.InvoiceType == fms.ContractInvoiceTypePay {
+			opType = fms.ContractRegisterOpTypePayment
+		}
+
+		logItem := new(fms.ContractRegisterLog)
+		logItem.ContractRegisterId = req.ContractRegisterId
+		logItem.AdminId = int(adminInfo.AdminId)
+		logItem.AdminName = adminInfo.AdminName
+		logItem.OpData = opData
+		logItem.OpType = opType
+		logItem.CreateTime = time.Now().Local()
+		if e = logItem.Create(); e != nil {
+			return
+		}
+	}()
+	resp.Ok("操作成功", c)
+}

+ 4 - 0
controller/contract/service.go

@@ -0,0 +1,4 @@
+package contract
+
+// ServiceController 合同套餐
+type ServiceController struct{}

+ 58 - 0
controller/crm/company_seller.go

@@ -0,0 +1,58 @@
+package crm
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/crm"
+)
+
+// CompanySellerController CRM销售
+type CompanySellerController struct{}
+
+// List
+// @Title 销售列表
+// @Description 销售列表
+// @Param   SellerType  query  int  false  "销售类型: 0-所有; 1-FICC; 2-权益"
+// @Success 200 {object} crm.CompanySellerList
+// @router /crm/company_seller/list [get]
+func (rg *CompanySellerController) List(c *gin.Context) {
+	var req crm.CompanySellerListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+
+	roleCodeArr := make([]string, 0)
+	if req.SellerType == crm.CompanyProductRai {
+		roleCodeArr = []string{
+			crm.ROLE_TYPE_CODE_RAI_ADMIN,
+			crm.ROLE_TYPE_CODE_RAI_DEPARTMENT,
+			crm.ROLE_TYPE_CODE_RAI_GROUP,
+			crm.ROLE_TYPE_CODE_RAI_SELLER,
+		}
+	} else {
+		roleCodeArr = []string{
+			crm.ROLE_TYPE_CODE_FICC_ADMIN,
+			crm.ROLE_TYPE_CODE_FICC_DEPARTMENT,
+			crm.ROLE_TYPE_CODE_FICC_GROUP,
+			crm.ROLE_TYPE_CODE_FICC_TEAM,
+			crm.ROLE_TYPE_CODE_FICC_SELLER,
+		}
+	}
+	cond := `b.role_type_code IN ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, roleCodeArr)
+	list, e := crm.GetCompanySellerByRoleCodes(cond, pars)
+	if e != nil {
+		resp.FailData("获取失败", "获取销售列表失败, Err:"+e.Error(), c)
+		return
+	}
+	resp.OkData("获取成功", list, c)
+}

+ 102 - 0
controller/crm/contract.go

@@ -0,0 +1,102 @@
+package crm
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/crm"
+	"hongze/fms_api/utils"
+)
+
+// ContractController CRM系统合同
+type ContractController struct{}
+
+// SearchList
+// @Title 搜索合同
+// @Description 搜索合同
+// @Param   Keyword		query	string	false	"关键词"
+// @Param   ProductId	query	int		false	"合同类型: 0-全部; 1-FICC; 2-权益"
+// @Success 200 {object} crm.ContractSearchListResp
+// @router /crm/contract/search_list [get]
+func (rg *ContractController) SearchList(c *gin.Context) {
+	var req crm.ContractSearchListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+
+	cond := `status IN ('已审批', '已签回')`
+	pars := make([]interface{}, 0)
+	if req.Keyword != "" {
+		kw := "%" + req.Keyword + "%"
+		cond += ` AND (company_name LIKE ? OR contract_code LIKE ?)`
+		pars = append(pars, kw, kw, kw)
+	}
+	if req.ProductId > 0 {
+		cond += ` AND product_id = ?`
+		pars = append(pars, req.ProductId)
+	}
+	page := new(base.Page)
+	page.SetPageSize(req.PageSize)
+	page.SetCurrent(req.Current)
+	page.AddOrderItem(base.OrderItem{Column: "create_time", Asc: false})
+
+	ob := new(crm.Contract)
+	total, list, e := ob.PageList(page, cond, pars)
+	if e != nil {
+		resp.FailMsg("获取失败", "获取合同登记列表, Err: "+e.Error(), c)
+		return
+	}
+
+	// 获取代付合同实际使用方
+	peyContractIds := make([]int, 0)
+	for i := range list {
+		if list[i].ContractBusinessType == "代付合同" {
+			peyContractIds = append(peyContractIds, list[i].ContractId)
+		}
+	}
+	payCompanyMap := make(map[int]string, 0)
+	if len(peyContractIds) > 0 {
+		payCond := `a.status IN ('已签回', '已审批') AND b.payment_on_behalf_contract_id IN ?`
+		payPars := make([]interface{}, 0)
+		payPars = append(payPars, peyContractIds)
+		payList, e := crm.GetPayCompanyByContractIds(payCond, payPars)
+		if e != nil {
+			resp.FailMsg("获取失败", "获取代付合同信息失败, Err: "+e.Error(), c)
+			return
+		}
+		for i := range payList {
+			payCompanyMap[payList[i].PayOnBehalfContractId] = payList[i].CompanyName
+		}
+	}
+
+	respList := make([]*crm.ContractSearchListResp, 0)
+	for i := range list {
+		respList = append(respList, &crm.ContractSearchListResp{
+			ContractId:      list[i].ContractId,
+			ContractCode:    list[i].ContractCode,
+			CompanyName:     list[i].CompanyName,
+			PayCompanyName:  payCompanyMap[list[i].ContractId],
+			SellerId:        list[i].SellerId,
+			SellerName:      list[i].SellerName,
+			ContractTypeKey: crm.ContractTypeFmsMap[list[i].ContractType],
+			ContractType:    list[i].ContractType,
+			Price:           list[i].Price,
+			StartDate:       utils.TimeTransferString(utils.FormatDate, list[i].StartDate),
+			EndDate:         utils.TimeTransferString(utils.FormatDate, list[i].EndDate),
+		})
+	}
+
+	page.SetTotal(total)
+	baseData := new(base.BaseData)
+	baseData.SetPage(page)
+	baseData.SetList(respList)
+	resp.OkData("获取成功", baseData, c)
+}

+ 2 - 2
controller/resource/video.go

@@ -2,8 +2,8 @@ package resource
 
 import (
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/resp"
-	services "hongze/hrms_api/services/resource"
+	"hongze/fms_api/controller/resp"
+	services "hongze/fms_api/services/resource"
 )
 
 type VideoController struct{}

+ 1 - 1
controller/resp/base.go

@@ -4,7 +4,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/global"
+	"hongze/fms_api/global"
 	"strings"
 )
 

+ 6 - 12
controller/system/sys_admin.go

@@ -3,12 +3,12 @@ package system
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	systemService "hongze/hrms_api/services/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	systemService "hongze/fms_api/services/system"
+	"hongze/fms_api/utils"
 	"time"
 )
 
@@ -49,9 +49,6 @@ func (a *SysAdminController) Add(c *gin.Context) {
 		return
 	}
 
-	//todo 验证部门信息
-	//todo 验证角色信息
-	// 新增账号
 	item = &system.SysAdmin{
 		AdminName: req.AdminName,
 		RealName:  req.RealName,
@@ -365,9 +362,6 @@ func (a *SysAdminController) Edit(c *gin.Context) {
 		}
 	}
 
-	//todo 验证部门信息
-	//todo 验证角色信息
-	// 更新账号
 	updateStr := []string{"admin_name", "real_name", "enabled", "email", "mobile", "dept_id", "role_id", "position", "remark"}
 	item.AdminName = req.AdminName
 	item.RealName = req.RealName

+ 6 - 6
controller/system/sys_dept.go

@@ -3,12 +3,12 @@ package system
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	systemService "hongze/hrms_api/services/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	systemService "hongze/fms_api/services/system"
+	"hongze/fms_api/utils"
 )
 
 type SysDeptController struct {

+ 6 - 6
controller/system/sys_menu.go

@@ -3,12 +3,12 @@ package system
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	systemService "hongze/hrms_api/services/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	systemService "hongze/fms_api/services/system"
+	"hongze/fms_api/utils"
 )
 
 type SysMenuController struct {

+ 6 - 6
controller/system/sys_role.go

@@ -3,12 +3,12 @@ package system
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/go-playground/validator/v10"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	systemService "hongze/hrms_api/services/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	systemService "hongze/fms_api/services/system"
+	"hongze/fms_api/utils"
 )
 
 type SysRoleController struct {

+ 3 - 3
core/log.go

@@ -5,9 +5,9 @@ import (
 	"github.com/gin-gonic/gin"
 	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
 	oplogging "github.com/op/go-logging"
-	"hongze/hrms_api/config"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/config"
+	"hongze/fms_api/global"
+	"hongze/fms_api/utils"
 	"io"
 	"os"
 	"strings"

+ 2 - 2
core/run_server.go

@@ -2,8 +2,8 @@ package core
 
 import (
 	"fmt"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/init_serve"
+	"hongze/fms_api/global"
+	"hongze/fms_api/init_serve"
 )
 
 func RunServe() {

+ 2 - 2
global/global.go

@@ -8,8 +8,8 @@ import (
 	oplogging "github.com/op/go-logging"
 	"github.com/spf13/viper"
 	"gorm.io/gorm"
-	"hongze/hrms_api/config"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/config"
+	"hongze/fms_api/utils"
 	"io"
 )
 

+ 1 - 1
go.mod

@@ -1,4 +1,4 @@
-module hongze/hrms_api
+module hongze/fms_api
 
 go 1.15
 

+ 1 - 1
init_serve/mysql.go

@@ -5,7 +5,7 @@ import (
 	"gorm.io/driver/mysql"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
-	"hongze/hrms_api/global"
+	"hongze/fms_api/global"
 	"io"
 	"log"
 	"os"

+ 1 - 1
init_serve/redis.go

@@ -3,7 +3,7 @@ package init_serve
 import (
 	"context"
 	"github.com/go-redis/redis/v8"
-	"hongze/hrms_api/global"
+	"hongze/fms_api/global"
 )
 
 func Redis() {

+ 12 - 4
init_serve/router.go

@@ -4,10 +4,10 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/swaggo/gin-swagger"
 	"github.com/swaggo/gin-swagger/swaggerFiles"
-	_ "hongze/hrms_api/docs"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/middleware"
-	"hongze/hrms_api/routers"
+	_ "hongze/fms_api/docs"
+	"hongze/fms_api/global"
+	"hongze/fms_api/middleware"
+	"hongze/fms_api/routers"
 )
 
 // InitRouter 初始化路由
@@ -32,5 +32,13 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitSystem(systemGroup)
 	routers.InitAuth(rBase)
 	routers.InitResource(resourceGroup)
+
+	// CRM系统相关路由
+	crmGroup := rBase.Group("crm/")
+	routers.InitCrm(crmGroup)
+
+	// 合同相关路由
+	contractGroup := rBase.Group("contract/")
+	routers.InitContract(contractGroup)
 	return
 }

+ 1 - 1
main.go

@@ -1,7 +1,7 @@
 package main
 
 import (
-	"hongze/hrms_api/core"
+	"hongze/fms_api/core"
 )
 
 // @title 弘则人力资源管理系统API接口文档

+ 4 - 4
middleware/recover.go

@@ -3,10 +3,10 @@ package middleware
 import (
 	"fmt"
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/services/alarm_msg"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/services/alarm_msg"
+	"hongze/fms_api/utils"
 	"net/http"
 	"runtime"
 	"time"

+ 4 - 4
middleware/token.go

@@ -5,10 +5,10 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/resp"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
 	"time"
 )
 

+ 1 - 1
middleware/token_no_login.go

@@ -2,7 +2,7 @@ package middleware
 
 import (
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/resp"
+	"hongze/fms_api/controller/resp"
 )
 
 func TokenNoLogin() gin.HandlerFunc {

+ 3 - 3
models/base/time_base.go

@@ -3,11 +3,11 @@ package base
 import "time"
 
 type TimeBase struct {
-	CreateTime time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time"`       //创建时间
-	ModifyTime time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time"` //最后更新时间
+	CreateTime time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time" description:"创建时间"`
+	ModifyTime time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time" description:"最后更新时间"`
 }
 
 func (item *TimeBase) Set() {
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
-}
+}

+ 28 - 0
models/crm/company_seller.go

@@ -0,0 +1,28 @@
+package crm
+
+import "hongze/fms_api/global"
+
+// CompanySellerListReq CRM销售-列表请求体
+type CompanySellerListReq struct {
+	SellerType int `json:"seller_type" form:"seller_type" binding:"omitempty" description:"销售类型: 0-全部; 1-FICC; 2-权益"`
+}
+
+// CompanySellerList 销售列表
+type CompanySellerList struct {
+	AdminId   int    `description:"系统用户ID"`
+	AdminName string `description:"系统用户名称"`
+	RealName  string `description:"用户真实名称"`
+}
+
+// GetCompanySellerByRoleCodes 通过系统用户角色码获取销售
+func GetCompanySellerByRoleCodes(condition string, pars []interface{}) (results []*CompanySellerList, err error) {
+	results = make([]*CompanySellerList, 0)
+	query := global.MYSQL["report"].
+		Table("admin as a").
+		Select("a.admin_id, a.admin_name, real_name").
+		Joins("JOIN sys_role b ON a.role_id = b.role_id").
+		Where("a.enabled = 1").
+		Where(condition, pars...)
+	err = query.Find(&results).Error
+	return
+}

+ 45 - 0
models/crm/constants.go

@@ -0,0 +1,45 @@
+package crm
+
+const (
+	ROLE_TYPE_ADMIN       = "管理员"
+	ROLE_TYPE_FICC_ADMIN  = "ficc管理员"
+	ROLE_TYPE_FICC_SELLER = "ficc销售"
+	ROLE_TYPE_RAI_ADMIN   = "权益管理员"
+	ROLE_TYPE_RAI_SELLER  = "权益销售"
+
+	ROLE_TYPE_FICC_GROUP      = "ficc组长"
+	ROLE_TYPE_RAI_GROUP       = "权益组长"
+	ROLE_TYPE_FICC_DEPARTMENT = "ficc部门经理"
+	ROLE_TYPE_RAI_DEPARTMENT  = "权益部门经理"
+	ROLE_TYPE_FICC_RESEARCHR  = "ficc研究员"
+	ROLE_TYPE_RAI_RESEARCHR   = "权益研究员"
+
+	ROLE_TYPE_CODE_ADMIN           = "admin"           //管理员
+	ROLE_TYPE_CODE_FICC_ADMIN      = "ficc_admin"      //ficc管理员
+	ROLE_TYPE_CODE_FICC_SELLER     = "ficc_seller"     //ficc销售
+	ROLE_TYPE_CODE_RAI_ADMIN       = "rai_admin"       //权益管理员
+	ROLE_TYPE_CODE_RAI_SELLER      = "rai_seller"      //权益销售
+	ROLE_TYPE_CODE_FICC_GROUP      = "ficc_group"      //ficc销售主管
+	ROLE_TYPE_CODE_RAI_GROUP       = "rai_group"       //ficc组长
+	ROLE_TYPE_CODE_FICC_DEPARTMENT = "ficc_department" //ficc部门经理
+	ROLE_TYPE_CODE_RAI_DEPARTMENT  = "rai_department"  //权益部门经理
+	ROLE_TYPE_CODE_FICC_RESEARCHR  = "ficc_researcher" //ficc研究员
+	ROLE_TYPE_CODE_RESEARCHR       = "researcher"      //ficc研究员(最早定义的)
+	ROLE_TYPE_CODE_RAI_RESEARCHR   = "rai_researcher"  //权益研究员
+	ROLE_TYPE_CODE_COMPLIANCE      = "compliance"      //合规角色
+	ROLE_TYPE_CODE_FINANCE         = "finance"         //财务角色
+	ROLE_TYPE_CODE_FICC_TEAM       = "ficc_team"       //ficc销售组长
+
+	CompanyProductFicc = 1 // FICC
+	CompanyProductRai  = 2 // 权益
+
+	// 合同类型
+	ContractTypeNew   = "新签合同" // 新签
+	ContractTypeRenew = "续约合同" // 续约
+)
+
+// ContractTypeFmsMap CRM系统合同类型/FMS系统合同类型
+var ContractTypeFmsMap = map[string]int{
+	ContractTypeNew:   1,
+	ContractTypeRenew: 2,
+}

+ 106 - 0
models/crm/contract.go

@@ -0,0 +1,106 @@
+package crm
+
+import (
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"time"
+)
+
+// Contract CRM系统合同
+type Contract struct {
+	ContractId           int       `gorm:"primaryKey;column:contract_id"`
+	ContractCode         string    `description:"合同编号,长度32位"`
+	SellerId             int       `description:"所属销售id"`
+	SellerName           string    `description:"所属销售名称"`
+	ProductId            int       `description:"产品id,1:ficc;2:权益"`
+	ContractBusinessType string    `description:"合同业务类型,枚举值:'业务合同','代付合同'"`
+	ContractType         string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	Status               string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已解约'"`
+	StartDate            time.Time `description:"合同开始日期"`
+	EndDate              time.Time `description:"合同结束日期"`
+	OriginalPrice        float64   `description:"合同原金额,优惠前的金额"`
+	Price                float64   `description:"实际金额,优惠后的金额"`
+	PayRemark            string    `description:"付款方式说明,长度255位"`
+	PayChannel           string    `description:"付款渠道,长度255位"`
+	CompanyName          string    `description:"客户名称,甲方名称,长度32位"`
+	CreditCode           string    `description:"社会统一信用代码,长度64位"`
+	ProvinceId           int       `description:"省级id"`
+	Province             string    `description:"省级名称,长度16位"`
+	CityId               int       `description:"市级id"`
+	City                 string    `description:"市级名称,长度32位"`
+	Address              string    `description:"详细地址"`
+	Fax                  string    `description:"传真,长度32位"`
+	Phone                string    `description:"电话,长度32位"`
+	Postcode             string    `description:"邮编,长度16位"`
+	Remark               string    `description:"补充内容,长度255位"`
+	SellerRemark         string    `description:"销售备注,长度255位"`
+	ModifyContent        string    `description:"修改内容"`
+	ApprovalRemark       string    `description:"审核备注"`
+	FileUrl              string    `description:"合同文件地址"`
+	CheckBackFileUrl     string    `description:"签回合同文件地址"`
+	RescindFileUrl       string    `description:"解约合同文件地址"`
+	TemplateId           int       `description:"模板id"`
+	SourceId             int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
+	IsDelete             int       `description:"是否已经删除,0:未删除,1:已删除" json:"-"`
+	ApproveTime          time.Time `description:"审批时间"`
+	InvalidTime          time.Time `description:"作废时间"`
+	CheckBackFileTime    time.Time `description:"合同签回时间"`
+	RescindTime          time.Time `description:"解约时间"`
+	ModifyTime           time.Time `description:"合同最近一次修改时间"`
+	CreateTime           time.Time `description:"合同添加时间"`
+}
+
+func (c *Contract) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*Contract, err error) {
+	results = make([]*Contract, 0)
+	query := global.MYSQL["report"].Model(c).
+		Where("is_delete = 0").
+		Where(condition, pars...)
+	query.Count(&count)
+	if len(page.GetOrderItemsString()) > 0 {
+		query = query.Order(page.GetOrderItemsString())
+	}
+	err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
+	return
+}
+
+// ContractSearchListReq CRM系统合同-搜索列表请求体
+type ContractSearchListReq struct {
+	Keyword   string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
+	ProductId int    `json:"product_id" form:"product_id" binding:"omitempty" description:"产品: 0-全部; 1-FICC; 2-权益"`
+	base.PageReq
+}
+
+// ContractSearchListResp CRM系统合同-搜索列表响应体
+type ContractSearchListResp struct {
+	ContractId      int     `json:"contract_id" description:"合同ID"`
+	ContractCode    string  `json:"contract_code" description:"合同编号"`
+	CompanyName     string  `json:"company_name" description:"客户名称"`
+	PayCompanyName  string  `json:"Pay_company_name" description:"代付客户名称"`
+	SellerId        int     `json:"seller_id" description:"销售ID"`
+	SellerName      string  `json:"seller_name" description:"销售名称"`
+	ContractTypeKey int     `json:"contract_type_key" description:"FMS合同类型: 1-新签; 2-续约; 0-补充协议(暂无);"`
+	ContractType    string  `json:"contract_type" description:"CRM合同类型: 新签合同; 续约合同; 补充协议;"`
+	Price           float64 `json:"price" description:"合同金额"`
+	StartDate       string  `json:"start_date" description:"合同开始日期"`
+	EndDate         string  `json:"end_date" description:"合同结束日期"`
+}
+
+// PayCompanyRelation 代付合同
+type PayCompanyRelation struct {
+	ContractId            int    `description:"代付合同ID"`
+	CompanyName           string `description:"代付方名称"`
+	PayOnBehalfContractId int    `description:"实际使用方合同ID"`
+}
+
+// GetPayCompanyByContractIds 通过合同IDs获取代付客户信息
+func GetPayCompanyByContractIds(condition string, pars []interface{}) (results []*PayCompanyRelation, err error) {
+	results = make([]*PayCompanyRelation, 0)
+	query := global.MYSQL["report"].
+		Table("contract as a").
+		Select("a.contract_id, a.company_name, b.payment_on_behalf_contract_id").
+		Joins("JOIN contract_relation b ON a.contract_id = b.contract_id").
+		Where("a.is_delete = 0").
+		Where(condition, pars...)
+	err = query.Find(&results).Error
+	return
+}

+ 27 - 0
models/fms/constants.go

@@ -0,0 +1,27 @@
+package fms
+
+const (
+	// 合同类型
+	ContractTypeNew   = 1 // 新签
+	ContractTypeRenew = 2 // 续约
+
+	// 合同状态
+	ContractStatusApproved    = 1 // 已审批
+	ContractStatusSendOut     = 2 // 单章寄出
+	ContractStatusCheckedBack = 3 // 已签回
+
+	// 合同登记状态
+	ContractRegisterStatusIng      = 1 // 进行中
+	ContractRegisterStatusComplete = 2 // 已完成
+
+	// 合同登记操作类型
+	ContractRegisterOpTypeSave    = 1 // 合规登记
+	ContractRegisterOpTypeInvoice = 2 // 开票登记
+	ContractRegisterOpTypePayment = 3 // 到款登记
+	ContractRegisterOpTypeStatus  = 4 // 修改合同状态
+	ContractRegisterOpTypeDel     = 5 // 删除合同登记
+
+	// 合同登记开票类型
+	ContractInvoiceTypeMake = 1 // 开票登记
+	ContractInvoiceTypePay  = 2 // 到款登记
+)

+ 101 - 0
models/fms/contract_invoice.go

@@ -0,0 +1,101 @@
+package fms
+
+import (
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"time"
+)
+
+// ContractInvoice 合同开票表
+type ContractInvoice struct {
+	ContractInvoiceId  int       `gorm:"primaryKey;column:contract_invoice_id" json:"contract_invoice_id" description:"开票ID"`
+	ContractRegisterId int       `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
+	Amount             float64   `gorm:"column:amount" json:"amount" description:"金额"`
+	InvoiceType        int       `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记"`
+	InvoiceDate        time.Time `gorm:"column:invoice_time" json:"invoice_time" description:"开票日期/到款月"`
+	AdminId            int       `gorm:"column:admin_id" json:"admin_id" description:"操作人ID"`
+	AdminName          string    `gorm:"column:admin_name" json:"admin_name" description:"操作人姓名"`
+	Remark             string    `gorm:"column:remark" json:"remark" description:"备注信息"`
+	IsDeleted          int       `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
+	base.TimeBase
+}
+
+func (c *ContractInvoice) TableName() string {
+	return "contract_register"
+}
+
+func (c *ContractInvoice) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(c).Error
+	return
+}
+
+func (c *ContractInvoice) AddInBatches(list []*ContractInvoice) (err error) {
+	err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
+	return
+}
+
+func (c *ContractInvoice) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
+	return
+}
+
+func (c *ContractInvoice) List(condition string, pars []interface{}) (list []*ContractInvoice, err error) {
+	list = make([]*ContractInvoice, 0)
+	err = global.DEFAULT_MYSQL.Model(c).
+		Where("is_deleted = 0").
+		Where(condition, pars...).
+		Find(&list).Error
+	return
+}
+
+func (c *ContractInvoice) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractInvoice, err error) {
+	results = make([]*ContractInvoice, 0)
+	query := global.DEFAULT_MYSQL.Model(c).
+		Where("is_deleted = 0").
+		Where(condition, pars...)
+	query.Count(&count)
+	if len(page.GetOrderItemsString()) > 0 {
+		query = query.Order(page.GetOrderItemsString())
+	}
+	err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
+	return
+}
+
+// DeleteAndCreateNewInvoice 删除并新增登记
+func (c *ContractInvoice) DeleteAndCreateNewInvoice(contractRegisterId, invoiceType int, invoices []*ContractInvoice) (err error) {
+	tx := global.DEFAULT_MYSQL.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	err = tx.Model(c).
+		Where("contract_register_id = ? AND invoice_type = ?", contractRegisterId, invoiceType).
+		UpdateColumn("is_deleted", 1).Error
+	if err != nil {
+		return
+	}
+	if len(invoices) > 0 {
+		err = tx.CreateInBatches(invoices, len(invoices)).Error
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// ContractInvoiceSaveReq 合同开票-请求体
+type ContractInvoiceSaveReq struct {
+	ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
+	InvoiceType        int `json:"invoice_type" binding:"oneof=1 2" description:"类型: 1-开票登记; 2-到款登记"`
+	AmountList         []*ContractInvoiceSaveItem
+}
+
+// ContractInvoiceSaveReq 合同开票数据
+type ContractInvoiceSaveItem struct {
+	Amount      float64 `json:"amount" description:"开票金额/到款金额"`
+	InvoiceDate string  `json:"invoice_date" description:"开票日期/到款月"`
+}

+ 154 - 0
models/fms/contract_register.go

@@ -0,0 +1,154 @@
+package fms
+
+import (
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
+	"time"
+)
+
+// ContractRegister 合同登记表
+type ContractRegister struct {
+	ContractRegisterId int       `gorm:"primaryKey;column:contract_register_id" json:"contract_register_id" description:"登记ID"`
+	ContractCode       string    `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
+	CrmContractId      int       `gorm:"column:crm_contract_id" json:"crm_contract_id" description:"CRM系统-合同ID"`
+	ContractSource     int       `gorm:"column:contract_source" json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
+	CompanyName        string    `gorm:"column:company_name" json:"company_name" description:"客户名称"`
+	SellerId           int       `gorm:"column:seller_id" json:"seller_id" description:"CRM系统-销售ID"`
+	SellerName         int       `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-销售名称"`
+	ContractType       int       `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
+	ContractAmount     float64   `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
+	InvoicedAmount     float64   `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"`
+	PaymentAmount      float64   `gorm:"column:payment_amount" json:"payment_amount" description:"到款金额"`
+	StartDate          time.Time `gorm:"column:start_date" json:"start_date" description:"合同开始日期"`
+	EndDate            time.Time `gorm:"column:end_date" json:"end_date" description:"合同结束日期"`
+	SignDate           time.Time `gorm:"column:sign_date" json:"sign_date" description:"合同签订日期"`
+	AgreedPayTime      string    `gorm:"column:agreed_pay_time" json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
+	ContractStatus     int       `gorm:"column:contract_status" json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
+	RegisterStatus     int       `gorm:"column:register_status" json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
+	Remark             string    `gorm:"column:remark" json:"remark" description:"备注信息"`
+	IsDeleted          int       `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
+	base.TimeBase
+}
+
+func (c *ContractRegister) TableName() string {
+	return "contract_register"
+}
+
+func (c *ContractRegister) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(c).Error
+	return
+}
+
+func (c *ContractRegister) AddInBatches(list []*ContractRegister) (err error) {
+	err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
+	return
+}
+
+func (c *ContractRegister) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
+	return
+}
+
+func (c *ContractRegister) Fetch(id int) (item *ContractRegister, err error) {
+	err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", id).First(&item).Error
+	return
+}
+
+func (c *ContractRegister) FetchByCondition(condition string, pars []interface{}) (item *ContractRegister, err error) {
+	err = global.DEFAULT_MYSQL.Model(c).
+		Where("is_deleted = 0").
+		Where(condition, pars...).
+		First(&item).Error
+	return
+}
+
+func (c *ContractRegister) List(condition string, pars []interface{}) (list []*ContractRegister, err error) {
+	list = make([]*ContractRegister, 0)
+	err = global.DEFAULT_MYSQL.Model(c).
+		Where("is_deleted = 0").
+		Where(condition, pars...).
+		Find(&list).Error
+	return
+}
+
+func (c *ContractRegister) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegister, err error) {
+	results = make([]*ContractRegister, 0)
+	query := global.DEFAULT_MYSQL.Model(c).
+		Where("is_deleted = 0").
+		Where(condition, pars...)
+	query.Count(&count)
+	if len(page.GetOrderItemsString()) > 0 {
+		query = query.Order(page.GetOrderItemsString())
+	}
+	err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
+	return
+}
+
+// ContractRegisterListReq 合同登记列表请求体
+type ContractRegisterListReq struct {
+	Keyword        string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
+	StartDate      string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"合同开始日期"`
+	EndDate        string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"合同结束日期"`
+	ServiceType    int    `json:"service_type" form:"service_type" description:"套餐类型"`
+	ContractType   int    `json:"contract_type" form:"contract_type" description:"合同类型"`
+	RegisterStatus int    `json:"register_status" form:"register_status" description:"登记状态"`
+	base.PageReq
+}
+
+// ContractRegisterListResp 合同登记列表响应体
+type ContractRegisterListResp struct {
+	ContractRegisterId int     `json:"contract_register_id" description:"登记ID"`
+	ContractCode       string  `json:"contract_code" description:"合同编号"`
+	CompanyName        string  `json:"company_name" description:"客户名称"`
+	SellerId           int     `json:"seller_id" description:"CRM系统-销售ID"`
+	SellerName         int     `json:"seller_name" description:"CRM系统-销售名称"`
+	ContractType       int     `json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
+	ContractAmount     float64 `json:"contract_amount" description:"合同金额"`
+	InvoicedAmount     float64 `json:"invoiced_amount" description:"开票金额"`
+	PaymentAmount      float64 `json:"payment_amount" description:"到款金额"`
+	StartDate          string  `json:"start_date" description:"合同开始日期"`
+	EndDate            string  `json:"end_date" description:"合同结束日期"`
+	SignDate           string  `json:"sign_date" description:"合同签订日期"`
+	AgreedPayTime      string  `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
+	ContractStatus     int     `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
+	RegisterStatus     int     `json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
+	Remark             string  `json:"remark" description:"备注信息"`
+	CreateTime         string  `json:"create_time" description:"登记时间"`
+	// TODO: 套餐信息
+}
+
+// ContractRegisterDelReq 合同登记-删除请求体
+type ContractRegisterDelReq struct {
+	ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
+}
+
+// ContractRegisterUpdateStatusReq 合同登记-修改合同状态请求体
+type ContractRegisterUpdateStatusReq struct {
+	ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
+	ContractStatus     int `json:"contract_status" binding:"oneof=1 2 3" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
+}
+
+// ContractRegisterAddReq 新增合同登记请求体
+type ContractRegisterAddReq struct {
+	ContractCode   string  `json:"contract_code" binding:"required" description:"合同编号"`
+	CrmContractId  int     `json:"crm_contract_id" description:"CRM系统-合同ID"`
+	ContractSource int     `json:"contract_source" binding:"oneof=0 1" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
+	CompanyName    string  `gorm:"column:company_name" binding:"required" json:"company_name" description:"客户名称"`
+	SellerId       int     `json:"seller_id" binding:"required" description:"CRM系统-销售ID"`
+	SellerName     int     `json:"seller_name" binding:"required" description:"CRM系统-销售名称"`
+	ContractType   int     `json:"contract_type" binding:"oneof=1 2" description:"合同类型: 1-新签; 2-续约"`
+	ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"`
+	StartDate      string  `json:"start_date" binding:"required" description:"合同开始日期"`
+	EndDate        string  `json:"end_date" binding:"required" description:"合同结束日期"`
+	SignDate       string  `json:"sign_date" binding:"required" description:"合同签订日期"`
+	AgreedPayTime  string  `json:"agreed_pay_time" binding:"required" description:"约定付款时间(如:生效日起10日内)"`
+	ContractStatus int     `json:"contract_status" binding:"oneof=1 2 3" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
+	Remark         string  `json:"remark" description:"备注信息"`
+	// TODO:套餐信息
+}
+
+// ContractRegisterEditReq 编辑合同登记请求体
+type ContractRegisterEditReq struct {
+	ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
+	ContractRegisterAddReq
+}

+ 40 - 0
models/fms/contract_register_log.go

@@ -0,0 +1,40 @@
+package fms
+
+import (
+	"hongze/fms_api/global"
+	"time"
+)
+
+// ContractRegisterLog 合同登记操作记录表
+type ContractRegisterLog struct {
+	Id                 int       `gorm:"primaryKey;column:id" json:"id" description:"记录ID"`
+	ContractRegisterId int       `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
+	AdminId            int       `gorm:"column:admin_id" json:"admin_id" description:"操作人ID"`
+	AdminName          string    `gorm:"column:admin_name" json:"admin_name" description:"当时操作人姓名"`
+	OpData             string    `gorm:"column:op_data" json:"op_data" description:"操作数据-JSON"`
+	OpType             int       `gorm:"column:op_type" json:"op_type" description:"操作类型: 1-合规登记; 2-开票登记; 3-到款登记; 4-修改合同状态; 5-删除合同登记;"`
+	Remark             string    `gorm:"column:remark" json:"remark" description:"备注信息"`
+	CreateTime         time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time" description:"创建时间"`
+}
+
+func (c *ContractRegisterLog) TableName() string {
+	return "contract_register_log"
+}
+
+func (c *ContractRegisterLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(c).Error
+	return
+}
+
+func (c *ContractRegisterLog) AddInBatches(list []*ContractRegisterLog) (err error) {
+	err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
+	return
+}
+
+func (c *ContractRegisterLog) List(condition string, pars []interface{}) (list []*ContractRegisterLog, err error) {
+	list = make([]*ContractRegisterLog, 0)
+	err = global.DEFAULT_MYSQL.Model(c).
+		Where(condition, pars...).
+		Find(&list).Error
+	return
+}

+ 5 - 0
models/fms/contract_service.go

@@ -0,0 +1,5 @@
+package fms
+
+// ContractService 合同服务套餐
+type ContractService struct {
+}

+ 2 - 2
models/system/sys_admin.go

@@ -2,8 +2,8 @@ package system
 
 import (
 	"context"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
 	"time"
 )
 

+ 2 - 2
models/system/sys_dept.go

@@ -2,8 +2,8 @@ package system
 
 import (
 	"context"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
 )
 
 // 部门表

+ 2 - 2
models/system/sys_menu.go

@@ -2,8 +2,8 @@ package system
 
 import (
 	"context"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
 )
 
 // 菜单表

+ 2 - 2
models/system/sys_role.go

@@ -2,8 +2,8 @@ package system
 
 import (
 	"context"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
 )
 
 // 角色表

+ 1 - 1
models/system/sys_role_menu.go

@@ -2,7 +2,7 @@ package system
 
 import (
 	"context"
-	"hongze/hrms_api/global"
+	"hongze/fms_api/global"
 	"time"
 )
 

+ 2 - 2
models/system/sys_session.go

@@ -1,8 +1,8 @@
 package system
 
 import (
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/base"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/base"
 	"time"
 )
 

+ 1 - 1
routers/auth.go

@@ -2,7 +2,7 @@ package routers
 
 import (
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller"
+	"hongze/fms_api/controller"
 )
 
 func InitAuth(baseGroup *gin.RouterGroup) {

+ 22 - 0
routers/contract.go

@@ -0,0 +1,22 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/fms_api/controller/contract"
+	"hongze/fms_api/middleware"
+)
+
+func InitContract(rg *gin.RouterGroup) {
+	// 合同登记
+	cr := new(contract.RegisterController)
+	crGroup := rg.Group("register/").Use(middleware.Token())
+	crGroup.GET("list", cr.List)
+	crGroup.POST("add", cr.Add)
+	crGroup.POST("edit", cr.Edit)
+	crGroup.POST("del", cr.Del)
+	crGroup.GET("detail", cr.Detail)
+	crGroup.POST("update_status", cr.UpdateStatus)
+	crGroup.POST("export", cr.Export)
+	crGroup.POST("invoice", cr.Invoice)
+	crGroup.POST("payment", cr.Invoice) // 与开票登记用同一个func, 路由作区分划分权限
+}

+ 19 - 0
routers/crm.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/fms_api/controller/crm"
+	"hongze/fms_api/middleware"
+)
+
+func InitCrm(rg *gin.RouterGroup) {
+	// 合同
+	ct := new(crm.ContractController)
+	crGroup := rg.Group("contract/").Use(middleware.Token())
+	crGroup.GET("search_list", ct.SearchList)
+
+	// 销售
+	sl := new(crm.CompanySellerController)
+	slGroup := rg.Group("company_seller/").Use(middleware.Token())
+	slGroup.GET("list", sl.List)
+}

+ 1 - 1
routers/resource.go

@@ -2,7 +2,7 @@ package routers
 
 import (
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/resource"
+	"hongze/fms_api/controller/resource"
 )
 
 func InitResource(baseGroup *gin.RouterGroup) {

+ 2 - 2
routers/system.go

@@ -2,8 +2,8 @@ package routers
 
 import (
 	"github.com/gin-gonic/gin"
-	"hongze/hrms_api/controller/system"
-	"hongze/hrms_api/middleware"
+	"hongze/fms_api/controller/system"
+	"hongze/fms_api/middleware"
 )
 
 func InitSystem(systemGroup *gin.RouterGroup) {

+ 2 - 2
services/alarm_msg/alarm_msg.go

@@ -3,8 +3,8 @@ package alarm_msg
 import (
 	"encoding/json"
 	"github.com/rdlucklib/rdluck_tools/http"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/global"
+	"hongze/fms_api/utils"
 )
 
 var (

+ 5 - 0
services/fms/contract_register.go

@@ -0,0 +1,5 @@
+package fms
+
+func CheckContractRegisterAmount() {
+
+}

+ 2 - 2
services/resource/email.go

@@ -6,8 +6,8 @@ import (
 	"github.com/emersion/go-imap/client"
 	"github.com/emersion/go-message/charset"
 	"github.com/emersion/go-message/mail"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/global"
+	"hongze/fms_api/utils"
 	"io"
 	"io/ioutil"
 	"os"

+ 4 - 5
services/resource/oss.go

@@ -6,9 +6,9 @@ import (
 	"errors"
 	"github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
 	"github.com/aliyun/aliyun-oss-go-sdk/oss"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/services/alarm_msg"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/global"
+	"hongze/fms_api/services/alarm_msg"
+	"hongze/fms_api/utils"
 	"os"
 	"time"
 )
@@ -139,8 +139,7 @@ func UploadAliyunV2(filename, filepath string) (string, error) {
 }
 
 const (
-	HzEndpoint = "oss-cn-shanghai.aliyuncs.com"
-	// todo 修改bucket空间
+	HzEndpoint          = "oss-cn-shanghai.aliyuncs.com"
 	HzBucketName string = "hzchart"
 )
 

+ 1 - 1
services/resource/pdf.go

@@ -1,7 +1,7 @@
 package resource
 
 import (
-	"hongze/hrms_api/global"
+	"hongze/fms_api/global"
 	"os"
 	"os/exec"
 	"path"

+ 3 - 3
services/system/sys_admin.go

@@ -5,9 +5,9 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/models/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
 	"strconv"
 	"time"
 )

+ 3 - 3
services/system/sys_dept.go

@@ -2,9 +2,9 @@ package system
 
 import (
 	"errors"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
 )
 
 func DeptTreeList(page base.IPage, req *system.DeptListReq) (count int64, list []*system.DeptListItemResp, err error, errMsg string) {

+ 3 - 3
services/system/sys_menu.go

@@ -2,9 +2,9 @@ package system
 
 import (
 	"errors"
-	"hongze/hrms_api/models/base"
-	"hongze/hrms_api/models/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/models/base"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
 )
 
 //MenuList 只返回当前登录管理员有权限的菜单列表,不返回按钮

+ 2 - 2
services/system/sys_role.go

@@ -2,8 +2,8 @@ package system
 
 import (
 	"errors"
-	"hongze/hrms_api/models/system"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/models/system"
+	"hongze/fms_api/utils"
 	"time"
 )
 

+ 3 - 3
task/task.go

@@ -2,9 +2,9 @@ package task
 
 import (
 	"fmt"
-	"hongze/hrms_api/global"
-	"hongze/hrms_api/services/alarm_msg"
-	"hongze/hrms_api/utils"
+	"hongze/fms_api/global"
+	"hongze/fms_api/services/alarm_msg"
+	"hongze/fms_api/utils"
 	"os"
 	"runtime"
 	"sync"