Browse Source

feat: 编号规则相关接口

lanjianrong 4 years ago
parent
commit
bccb092afa
7 changed files with 193 additions and 23 deletions
  1. 7 7
      dao/rule_dao.go
  2. 18 1
      dao/safe_dao.go
  3. 70 7
      services/rule_service.go
  4. 8 0
      services/safe_service.go
  5. 48 8
      web/api/rule_api.go
  6. 27 0
      web/utils/utils.go
  7. 15 0
      web/viewmodels/rule.go

+ 7 - 7
dao/rule_dao.go

@@ -39,7 +39,7 @@ func (d *RuleDao) FindByPidWithBid(pid int, bid int) *models.CmRule {
 }
 
 // 根据pid和bid更新、不存在则创建
-func (d *RuleDao) UpdateOrCreate(pid int, bid int, key string, value string) (bool, error) {
+func (d *RuleDao) UpdateOrCreate(pid int, bid int, key string, value string) error {
 	data := &models.CmRule{BidsectionId: bid, ProjectId: pid}
 	has, err := d.engine.Get(data)
 	if key == "safe_rule" {
@@ -49,16 +49,16 @@ func (d *RuleDao) UpdateOrCreate(pid int, bid int, key string, value string) (bo
 	} else {
 		data.ContractRule = value
 	}
-	fmt.Println("newData", data, "value", value, "key", key)
+	// fmt.Println("newData", data, "value", value, "key", key)
 	if has && err == nil {
-		affected, err := d.engine.Id(data.Id).Update(data)
+		_, err := d.engine.Id(data.Id).Update(data)
 		fmt.Println("err2", err)
-		return affected > 0, err
+		return err
 	} else if !has && err == nil {
-		affected, err := d.engine.Insert(data)
+		_, err := d.engine.Insert(data)
 		fmt.Println("err3", err)
-		return affected > 0, err
+		return err
 	}
 	fmt.Println(err)
-	return false, err
+	return err
 }

+ 18 - 1
dao/safe_dao.go

@@ -39,8 +39,8 @@ func (d *SafeDao) FindById(id int) *models.CmSafe {
 func (d *SafeDao) GetListByBid(id int) []models.CmSafe {
 	dataList := make([]models.CmSafe, 0)
 	err := d.engine.
-		Asc("create_time").
 		Where("bidsection_id=?", id).
+		Asc("id").
 		Find(&dataList)
 	if err != nil {
 		return dataList
@@ -60,3 +60,20 @@ func (d *SafeDao) DeleteRecord(id int) (bool, error) {
 	affected, err := d.engine.Id(id).Delete(safe)
 	return affected > 0, err
 }
+
+// 根据code获取记录
+func (d *SafeDao) FindByCode(code string) bool {
+	data := &models.CmSafe{Code: code}
+	has, _ := d.engine.Get(data)
+	return has
+}
+
+// 筛选出应用了当前规则的条数
+func (d *SafeDao) CountRuleCode(bid int) (int64, error) {
+	data := &models.CmSafe{}
+	total, err := d.engine.Where("`bidsection_id` = ?", bid).Count(data)
+	if err != nil {
+		total = 0
+	}
+	return total, err
+}

+ 70 - 7
services/rule_service.go

@@ -1,7 +1,14 @@
 package services
 
 import (
+	"encoding/json"
+	"errors"
+	"fmt"
 	"log"
+	"reflect"
+	"strconv"
+
+	"go.mod/web/utils"
 
 	"github.com/kataras/iris/v12"
 	"go.mod/dao"
@@ -11,19 +18,24 @@ import (
 
 type RuleService interface {
 	Get(pid int, id int) viewmodels.ViewRule
-	Post(pid int, id int, key string, value string) (bool, error)
+	Post(pid int, id int, key string, value string) error
+	AutoCode(bid int, pid int, codeType string) (string, error)
 	ValidRule(ctx iris.Context) (viewmodels.ValidField, error)
 }
 
 // //返回service操作类
 type ruleService struct {
-	daoRule *dao.RuleDao
+	daoRule       *dao.RuleDao
+	daoSafe       *dao.SafeDao
+	validAutoPath string
 }
 
 //创建项目用户service
 func NewRuleService() RuleService {
 	return &ruleService{
-		daoRule: dao.NewRuleDao(datasource.InstanceDbMaster()),
+		validAutoPath: "/api/rule/auto",
+		daoRule:       dao.NewRuleDao(datasource.InstanceDbMaster()),
+		daoSafe:       dao.NewSafeDao(datasource.InstanceDbMaster()),
 	}
 }
 
@@ -33,9 +45,56 @@ func (s *ruleService) Get(pid int, id int) viewmodels.ViewRule {
 	return viewData
 }
 
-func (s *ruleService) Post(pid int, id int, key string, value string) (bool, error) {
-	isOk, err := s.daoRule.UpdateOrCreate(pid, id, key, value)
-	return isOk, err
+func (s *ruleService) Post(pid int, id int, key string, value string) error {
+	err := s.daoRule.UpdateOrCreate(pid, id, key, value)
+	return err
+}
+
+// type Code struct {
+// 	Date string `from:"date" json:"date"`
+// 	Text string `from:"text" json:"text"`
+// 	Name string `from:"name" json:"name"`
+// 	Code string `from:"code" json:"code"`
+// }
+
+// 生成code
+func (s *ruleService) AutoCode(bid int, pid int, codeType string) (string, error) {
+	// 获取该标段的规则
+	rule := s.daoRule.FindByPidWithBid(pid, bid)
+	if codeType == "safeRule" {
+		var code viewmodels.RuleCode
+		err := json.Unmarshal([]byte(rule.SafeRule), &code)
+		// fmt.Println(code)
+		fmt.Println(err)
+		if err == nil {
+			total, err := s.daoSafe.CountRuleCode(bid)
+			value := reflect.ValueOf(code)
+			for i := 0; i < value.NumField(); i++ {
+				b := fmt.Sprint(value.Field(i))
+				if b == code.Code {
+					// fmt.Println(value.Field(i))
+					k, _ := strconv.Atoi(b)
+					code.Code = utils.CreateRuleCode(int64(k), total, len(code.Code))
+				}
+			}
+
+			e, err := json.Marshal(code)
+			if err != nil {
+				return "", err
+			}
+			// fmt.Println()
+			// var v interface{}
+			// for key, val := range code {
+			// 	fmt.Printf("%v===>%v\n", key, val)
+			// }
+			// c, _ := strconv.Atoi(code.Code)
+			// l := len(code.Code)
+			// fmt.Println(c, l, total)
+			// fmt.Println("total", total)
+			return string(e), err
+		}
+	}
+	return "", errors.New("生成code失败")
 }
 
 func (s *ruleService) ValidRule(ctx iris.Context) (viewmodels.ValidField, error) {
@@ -55,7 +114,11 @@ func (s *ruleService) ValidRule(ctx iris.Context) (viewmodels.ValidField, error)
 			log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
 			return safeVaild, err
 		}
-		err = safeVaild.Validate()
+		if ctx.Path() == s.validAutoPath {
+			err = safeVaild.ValidateAuto()
+		} else {
+			err = safeVaild.Validate()
+		}
 	}
 
 	// if ctx.Method() == "PUT" {

+ 8 - 0
services/safe_service.go

@@ -1,6 +1,7 @@
 package services
 
 import (
+	"errors"
 	"fmt"
 	"log"
 	"strconv"
@@ -28,6 +29,7 @@ type safeService struct {
 	daoSafeAudit      *dao.SafeAuditDao
 	daoSafeFile       *dao.SafeFileDao
 	daoProjectAccount *dao.ProjectAccountDao
+	daoRule           *dao.RuleDao
 	validDetail       string
 }
 
@@ -43,6 +45,7 @@ func NewSafeService() SafeService {
 }
 func (s *safeService) Get(id int, pid int) []viewmodels.SafeList {
 	datalist := s.daoSafe.GetListByBid(id)
+	fmt.Println(datalist)
 	safeList := make([]viewmodels.SafeList, 0)
 	for _, item := range datalist {
 		safeVM := viewmodels.SafeList{}
@@ -60,11 +63,16 @@ func (s *safeService) Get(id int, pid int) []viewmodels.SafeList {
 		safeVM.FileCounts = s.daoSafeFile.GetCount(item.Id)
 		safeList = append(safeList, safeVM)
 	}
+	fmt.Println("safeList", safeList)
 	return safeList
 }
 
 // post请求,插入单条数据
 func (s *safeService) Post(data models.CmSafe) error {
+	has := s.daoSafe.FindByCode(data.Code)
+	if has {
+		return errors.New("该编号已存在!")
+	}
 	Inserted, err := s.daoSafe.InsertRecord(data)
 	if Inserted == true {
 		return nil

+ 48 - 8
web/api/rule_api.go

@@ -8,8 +8,6 @@
 package api
 
 import (
-	"fmt"
-
 	"github.com/kataras/iris/v12"
 	"go.mod/services"
 	"go.mod/web/utils"
@@ -30,7 +28,7 @@ type RuleApi struct {
 // @Security ApiKeyAuth
 // @Param   bidsectionId     path    string     true        "标段ID"
 // @Param   projectId     path    string     true        "项目ID"
-// @Success 200 {object} viewmodels.Safe "{code:0成功,data:viewmodels.Safe,msg:}"
+// @Success 200 {object} viewmodels.ViewRule "{code:0成功,data:viewmodels.Safe,msg:}"
 // @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
 // @Router /api/rule [get]
 func (c *RuleApi) Get() {
@@ -60,7 +58,7 @@ func (c *RuleApi) Get() {
 	})
 }
 
-// @Summary 提交规则
+// @Summary 提交编号规则
 // @Tags 编号规则
 // @Description 提交规则
 // @Accept  json
@@ -69,7 +67,7 @@ func (c *RuleApi) Get() {
 // @Param   bidsectionId     body    string     true        "标段ID"
 // @Param   type 			body     string  true   "规则类型" eg:"safeRule、qualityRule、contractRule"
 // @Param   value 			body     string  true   "编号规则" eg:"'['202011', 'cc3']'"
-// @Success 200 {object} viewmodels.Safe "{code:0成功,data:viewmodels.Safe,msg:}"
+// @Success 200 {object} "{code:0成功,msg:}"
 // @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
 // @Router /api/rule [post]
 func (c *RuleApi) Post() {
@@ -90,9 +88,8 @@ func (c *RuleApi) Post() {
 		return
 	}
 
-	isOk, err := c.RuleService.Post(pid, bidsectionId, safeData.Type, safeData.Rule)
-	fmt.Println(err)
-	if isOk && err == nil {
+	err = c.RuleService.Post(pid, bidsectionId, safeData.Type, safeData.Rule)
+	if err == nil {
 		c.Ctx.JSON(iris.Map{
 			"code": 0,
 			"msg":  "请求成功",
@@ -104,3 +101,46 @@ func (c *RuleApi) Post() {
 		})
 	}
 }
+
+// @Summary 生成编号
+// @Tags 编号规则
+// @Description 提交规则
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     body    string     true        "标段ID"
+// @Param   type 			body     string  true   "规则类型" eg:"safeRule、qualityRule、contractRule"
+// @Success 200 {object}  "{code:0成功,data:"",msg:""}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/rule/auto [post]
+func (c *RuleApi) PostAuto() {
+	// 1.规则验证
+	safeData, err := c.RuleService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+	pid, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "项目id不存在, 请重新登录"})
+		return
+	}
+	bidsectionId, err := utils.GetDecryptId(safeData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	code, err := c.RuleService.AutoCode(bidsectionId, pid, safeData.Type)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  err,
+		})
+	} else {
+		c.Ctx.JSON(iris.Map{
+			"code": 0,
+			"msg":  "请求成功",
+			"data": code,
+		})
+	}
+}

+ 27 - 0
web/utils/utils.go

@@ -8,6 +8,7 @@ package utils
 
 import (
 	"errors"
+	"fmt"
 	"strconv"
 	"strings"
 
@@ -72,6 +73,32 @@ func GetDecryptId(id string) (int, error) {
 	return idInt, nil
 }
 
+// 生成code
+func CreateRuleCode(code int64, count int64, len int) string {
+	fmt.Println("code:", code, "count", count, "len", len)
+	// fmt.Println("rule", rule, "counts", count)
+	// egRule := strings.Split(rule.Eg, "-")
+	// for _, value := range egRule {
+	// 	if strings.Contains(value, "_") {
+	// 		// fmt.Println("rule", rule.Code, count)
+	// 		code := fmt.Printf("%0*d", rule.Code, count+1)
+
+	// 		strings.Replace(rule.Eg, )
+
+	// 	}
+	// }
+	// fmt.Println("egRule:", egRule)
+	// return "123"
+	// var newCode string
+	if code == 0 {
+		a := fmt.Sprintf("%0*d", len, count)
+		return a
+	} else {
+		b := fmt.Sprintf("%0*d", len, count+code)
+		return b
+	}
+}
+
 // // 获得项目ID
 // func GetProjectId(ctx iris.Context) (int, error) {
 // 	jwtInfo := ctx.Values().Get("jwt").(*jwt.Token)

+ 15 - 0
web/viewmodels/rule.go

@@ -31,8 +31,23 @@ type ValidField struct {
 	Rule         string `form:"rule" json:"rule"`
 }
 
+type RuleCode struct {
+	Eg   string `from:"eg" json:"eg"`
+	Date string `from:"date" json:"date"`
+	Text string `from:"text" json:"text"`
+	Name string `from:"name" json:"name"`
+	Code string `from:"code" json:"code"`
+}
+
 func (l ValidField) Validate() error {
 	return validation.ValidateStruct(&l,
 		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
 	)
 }
+
+func (l ValidField) ValidateAuto() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.Type, validation.Required.Error("类型不能为空")),
+	)
+}