package final import ( "errors" "fmt" "math" "time" "zhiyuan/models" "zhiyuan/pkg/db" "zhiyuan/pkg/logger" "zhiyuan/pkg/utils" "zhiyuan/services/admin" "github.com/Knetic/govaluate" "github.com/gin-gonic/gin" ) type FinalSiteAmount struct { ID int64 `json:"id" prop:"add:false"` SiteId int64 `json:"site_id" label:"套餐" type:"int" prop:"add edit" search:"="` Content string `json:"content" label:"内容" type:"string" prop:"edit"` ContractTotal float64 `json:"contract_total" label:"合同总金额" type:"float" prop:"add:false select:zy_final_site_amount.contract_total+sum(if(isnull(change.id),0,if(change.type2=2,-change.amount,change.amount)))"` Performance float64 `json:"performance" label:"业绩" type:"float" prop:"add:false"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"add:false"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"add:false"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"add:false"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"add:false"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"add:false"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"add:false"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"add:false"` StartTime int64 `json:"starttime" label:"开工日期" type:"int" prop:"edit"` Duration int64 `json:"duration" label:"工期" type:"int" prop:"edit"` EndTime int64 `json:"endtime" label:"完工日期" type:"int" prop:"add:false" search:"="` Files string `json:"files" label:"文件上传" type:"string" prop:"edit"` CreatedId int64 `json:"created_id" label:"创建人员" type:"int" prop:"add:false" search:"="` DeletedAt int64 `json:"deleted_at" prop:"add:false select:false"` CreatedAt int64 `json:"created_at" prop:"add:false"` UpdatedAt int64 `json:"updated_at" prop:"add:false"` db.BaseModel } func (FinalSiteAmount) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmount) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { return true } func (FinalSiteAmount) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error { site_id, _ := db.ToInt64(data["site_id"]) var site FinalSite db.GetModel(map[string]interface{}{ "id": site_id, "deleted_at": 0, }, &site) if site.ID == 0 { return errors.New("没有权限") } from := make(map[string]float64) var fields []FinalPkgField db.GetModel(map[string]interface{}{"pkg_id": site.PkgId}, &fields) for _, v := range fields { value, _ := db.ToFloat64(v.Value) from[v.Name] = value } data["content"] = utils.JsonEncode(from) data["contract_total"] = 0 data["performance"] = 0 data["created_id"] = c.GetInt("adminID") return nil } func (FinalSiteAmount) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error { var model FinalSiteAmount db.GetModel(map[string]interface{}{ "id": id, "deleted_at": 0, }, &model) var site FinalSite db.GetModel(map[string]interface{}{ "id": model.SiteId, "deleted_at": 0, }, &site) if !admin.CheckShop(int(site.ShopId), c.GetInt("adminID")) { return errors.New("没有权限") } if site.State == 1 { return errors.New("工地已开工") } /*project_direct_discount, _ := db.ToFloat64(data["project_direct_discount"]) project_direct, _ := db.ToFloat64(data["project_direct"]) quotation_discount := utils.FloatDiv(project_direct_discount, project_direct, 2) data["quotation_discount"] = quotation_discount material_purchase_total, _ := db.ToFloat64(data["material_purchase_total"]) special_total, _ := db.ToFloat64(data["special_total"]) taxes, _ := db.ToFloat64(data["taxes"]) quotation_total := utils.FloatAddSlice([]float64{project_direct_discount, material_purchase_total, special_total, taxes}, 2) data["quotation_total"] = quotation_total contract_total, _ := db.ToFloat64(data["contract_total"]) preferential_total := utils.FloatSub(quotation_total, contract_total, 2) data["preferential_total"] = preferential_total var site FinalSite db.GetModel(map[string]interface{}{ "id": model.SiteId, "deleted_at": 0, }, &site) var pkg FinalPkg db.GetModel(map[string]interface{}{ "id": site.PkgId, "deleted_at": 0, }, &pkg) design, _ := db.ToFloat64(data["design"]) draw, _ := db.ToFloat64(data["draw"]) must_draw := utils.FloatMul(pkg.Design, site.Area, 2) design_grant := utils.FloatMul(utils.FloatSub(utils.FloatAdd(design, draw, 2), must_draw, 2), quotation_discount, 2) design_grant = utils.FloatSub(design_grant, preferential_total, 2) if pkg.Discount > quotation_discount { diff := utils.FloatMul(project_direct, utils.FloatSub(pkg.Discount, quotation_discount, 2), 2) design_grant = utils.FloatAdd(design_grant, diff, 2) } data["design_grant"] = design_grant db.InsertModel(db.Type(FinalSiteAmountRecord{}), map[string]interface{}{ "site_id": model.SiteId, "deposit": data["deposit"], "package": data["package"], "personal_total": data["personal_total"], "personal_material": data["personal_material"], "personal_custom": data["personal_custom"], "personal_build": data["personal_build"], "draw": data["draw"], "design": data["design"], "project_direct": data["project_direct"], "project_direct_discount": data["project_direct_discount"], "quotation_discount": data["quotation_discount"], "material_purchase_total": data["material_purchase_total"], "purchase": data["purchase"], "upgrade": data["upgrade"], "special_total": data["special_total"], "taxes": data["taxes"], "deduction": data["deduction"], "quotation_total": data["quotation_total"], "preferential_total": data["preferential_total"], "contract_total": data["contract_total"], "files": data["files"], "created_id": c.GetInt("adminID"), })*/ starttime, _ := db.ToInt64(data["starttime"]) duration, _ := db.ToInt64(data["duration"]) if starttime == 0 { return errors.New("请输入开工时间") } if duration == 0 { return errors.New("请输入工期") } t := time.Unix(starttime, 0) t = t.AddDate(0, 0, int(duration)-1) endtime := t.Unix() err := db.UpdateModel(db.Type(site), site.ID, map[string]interface{}{ "starttime": starttime, "endtime": endtime, }) if err != nil { return err } from := utils.JsonDecode(db.ToString(data["content"])).ToMap() context, err := NewAmountContext(site, from) if err != nil { return err } contractTotal, performance, purchase, custom, personalCollect, personalMaterial, personalCustom, specialItem, designFree, err := context.Eval() if err != nil { return err } data["content"] = context.Save() data["contract_total"] = contractTotal data["performance"] = performance data["purchase"] = purchase data["custom"] = custom data["personal_collect"] = personalCollect data["personal_material"] = personalMaterial data["personal_custom"] = personalCustom data["special_item"] = specialItem data["design_free"] = designFree data["endtime"] = endtime db.InsertModel(db.Type(FinalSiteAmountRecord{}), map[string]interface{}{ "site_id": model.SiteId, "content": data["content"], "contract_total": data["contract_total"], "performance": data["performance"], "purchase": data["purchase"], "custom": data["custom"], "personal_collect": data["personal_collect"], "personal_material": data["personal_material"], "personal_custom": data["personal_custom"], "special_item": data["special_item"], "design_free": data["design_free"], "starttime": data["starttime"], "duration": data["duration"], "endtime": data["endtime"], "files": data["files"], "created_id": c.GetInt("adminID"), }) return nil } func (FinalSiteAmount) DelPrivilege(c *gin.Context, id int64) error { return nil } func (FinalSiteAmount) Page() bool { return false } func (FinalSiteAmount) Count() bool { return true } func (model FinalSiteAmount) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSiteChange{}, As: "change", On: []string{"`change`.`site_id` = " + model.TableName() + ".`site_id`"}, }, } } func (model FinalSiteAmount) GroupBy() string { return fmt.Sprintf("`%s`.`id`", model.TableName()) } type FinalSiteAmountDesignerStatist struct { DesignerId int64 `json:"designer_id" label:"设计师" prop:"select:site.designer_id"` DesignerName string `json:"designer_name" prop:"select:designer.username" search:"like"` DesignerPhone string `json:"designer_phone" prop:"select:designer.phone"` ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"` Performance float64 `json:"performance" label:"业绩" type:"float" prop:"select:sum(zy_final_site_amount.performance)"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"` db.BaseModel } func (FinalSiteAmountDesignerStatist) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmountDesignerStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) { adminID := s.Param(c.GetInt("adminID")) where := fmt.Sprintf("`site`.`designer_id` = %s", adminID) s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } if signtime1s, ok := data["signtime1"]; ok { if signtime1, ok := db.ToInt64(signtime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1))) } } if signtime2s, ok := data["signtime2"]; ok { if signtime2, ok := db.ToInt64(signtime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24))) } } return true } func (model FinalSiteAmountDesignerStatist) GroupBy() string { return "`site`.`designer_id`" } func (model FinalSiteAmountDesignerStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSite{}, As: "site", On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinAdmin{}, As: "designer", On: []string{"`designer`.`id` = `site`.`designer_id`"}, }, } } func (FinalSiteAmountDesignerStatist) Page() bool { return true } func (FinalSiteAmountDesignerStatist) Count() bool { return true } type FinalSiteAmountSalesmanStatist struct { SalesmanId float64 `json:"salesman_id" label:"业务员" prop:"select:site.salesman_id"` SalesmanName string `json:"salesman_name" prop:"select:salesman.username" search:"like"` SalesmanPhone string `json:"salesman_phone" prop:"select:salesman.phone"` ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"` Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"` db.BaseModel } func (FinalSiteAmountSalesmanStatist) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmountSalesmanStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) { adminID := s.Param(c.GetInt("adminID")) where := fmt.Sprintf("`site`.`salesman_id` = %s", adminID) s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } if signtime1s, ok := data["signtime1"]; ok { if signtime1, ok := db.ToInt64(signtime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1))) } } if signtime2s, ok := data["signtime2"]; ok { if signtime2, ok := db.ToInt64(signtime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24))) } } return true } func (model FinalSiteAmountSalesmanStatist) GroupBy() string { return "`site`.`salesman_id`" } func (model FinalSiteAmountSalesmanStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSite{}, As: "site", On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinAdmin{}, As: "salesman", On: []string{"`salesman`.`id` = `site`.`salesman_id`"}, }, } } func (FinalSiteAmountSalesmanStatist) Page() bool { return true } func (FinalSiteAmountSalesmanStatist) Count() bool { return true } type JoinDept struct { db.BaseModel } func (JoinDept) TableName() string { return "zy_dept" } type FinalSiteAmountDeptStatist struct { DeptId float64 `json:"dept_id" label:"部门" prop:"select:site.dept_id"` Name string `json:"name" prop:"select:concat(updept.name,'/',dept.name)" search:"like"` ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"` Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"` db.BaseModel } func (FinalSiteAmountDeptStatist) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmountDeptStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) { where := "1 = 2" s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } if signtime1s, ok := data["signtime1"]; ok { if signtime1, ok := db.ToInt64(signtime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1))) } } if signtime2s, ok := data["signtime2"]; ok { if signtime2, ok := db.ToInt64(signtime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24))) } } return true } func (model FinalSiteAmountDeptStatist) GroupBy() string { return "`site`.`dept_id`" } func (model FinalSiteAmountDeptStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSite{}, As: "site", On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinDept{}, As: "dept", On: []string{"`dept`.`id` = `site`.`dept_id`"}, }, { Model: JoinDept{}, As: "updept", On: []string{"`updept`.`id` = `dept`.`pid`"}, }, } } func (FinalSiteAmountDeptStatist) Page() bool { return true } func (FinalSiteAmountDeptStatist) Count() bool { return true } type FinalSiteAmountShopStatist struct { ShopId float64 `json:"shop_id" label:"公司" prop:"select:site.shop_id"` Name string `json:"name" prop:"select:shop.shop_name" search:"like"` ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"` Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"` db.BaseModel } func (FinalSiteAmountShopStatist) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmountShopStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) { where := "1 = 2" s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } if signtime1s, ok := data["signtime1"]; ok { if signtime1, ok := db.ToInt64(signtime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1))) } } if signtime2s, ok := data["signtime2"]; ok { if signtime2, ok := db.ToInt64(signtime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24))) } } return true } func (model FinalSiteAmountShopStatist) GroupBy() string { return "`site`.`shop_id`" } func (model FinalSiteAmountShopStatist) OrderBy() string { return "`shop`.`order_at` desc" } func (model FinalSiteAmountShopStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSite{}, As: "site", On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinShop{}, As: "shop", On: []string{"`shop`.`id` = `site`.`shop_id`"}, }, } } func (FinalSiteAmountShopStatist) Page() bool { return true } func (FinalSiteAmountShopStatist) Count() bool { return true } type FinalSiteAmountStoreStatist struct { StoreId float64 `json:"store_id" label:"门店" prop:"select:shop.store_id"` Name string `json:"name" prop:"select:store.name" search:"like"` ContractTotal float64 `json:"contract_total" label:"合同金额" type:"float" prop:"select:sum(zy_final_site_amount.contract_total)"` Performance float64 `json:"performance" label:"业绩" prop:"select:sum(zy_final_site_amount.performance)"` Purchase float64 `json:"purchase" label:"代购" type:"float" prop:"select:sum(zy_final_site_amount.purchase)"` Custom float64 `json:"custom" label:"定制" type:"float" prop:"select:sum(zy_final_site_amount.custom)"` PersonalCollect float64 `json:"personal_collect" label:"个性化汇总" type:"float" prop:"select:sum(zy_final_site_amount.personal_collect)"` PersonalMaterial float64 `json:"personal_material" label:"个性化材料" type:"float" prop:"select:sum(zy_final_site_amount.personal_material)"` PersonalCustom float64 `json:"personal_custom" label:"个性化定制" type:"float" prop:"select:sum(zy_final_site_amount.personal_custom)"` SpecialItem float64 `json:"special_item" label:"特殊项目代购" type:"float" prop:"select:sum(zy_final_site_amount.special_item)"` DesignFree float64 `json:"design_free" label:"设计费" type:"float" prop:"select:sum(zy_final_site_amount.design_free)"` db.BaseModel } func (FinalSiteAmountStoreStatist) TableName() string { return "zy_final_site_amount" } func (model FinalSiteAmountStoreStatist) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.CheckAuth([]string{"final:finalsitecontract:performance"}, c.GetInt("adminID")) { where := "1 = 2" s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } if signtime1s, ok := data["signtime1"]; ok { if signtime1, ok := db.ToInt64(signtime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` >= %s", s.Param(signtime1))) } } if signtime2s, ok := data["signtime2"]; ok { if signtime2, ok := db.ToInt64(signtime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`site`.`signtime` < %s", s.Param(signtime2+60*60*24))) } } return true } func (model FinalSiteAmountStoreStatist) GroupBy() string { return "`shop`.`store_id`" } func (model FinalSiteAmountStoreStatist) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalSite{}, As: "site", On: []string{"`site`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinShop{}, As: "shop", On: []string{"`shop`.`id` = `site`.`shop_id`"}, }, { Model: models.Store{}, As: "store", On: []string{"`store`.`id` = `shop`.`store_id`"}, }, } } func (FinalSiteAmountStoreStatist) Page() bool { return true } func (FinalSiteAmountStoreStatist) Count() bool { return true } func (model FinalSiteAmountStoreStatist) OrderBy() string { return "`store`.`order_at` desc" } type AmountContext struct { ID int64 `json:"id" label:"ID"` Site FinalSite `json:"site" label:"工地"` Pkg FinalPkg `json:"pkg" label:"套餐"` Fields []FinalPkgField `json:"fields" label:"字段"` Froms map[string]float64 `json:"froms" label:"表单"` Calls []string `json:"calls"` } func NewAmountContext(site FinalSite, data map[string]interface{}) (*AmountContext, error) { context := new(AmountContext) var pkg FinalPkg db.GetModel(map[string]interface{}{"id": site.PkgId}, &pkg) var fields []FinalPkgField db.GetModel(map[string]interface{}{"pkg_id": site.PkgId}, &fields) context.ID = site.PkgId context.Site = site context.Pkg = pkg context.Fields = fields context.Froms = make(map[string]float64) context.Calls = make([]string, 0) for _, v := range context.Fields { if v.Type == 0 || v.Type == 1 { value, _ := db.ToFloat64(data[v.Name]) if v.Type == 1 && value == 0 { return nil, errors.New("字段未填: " + v.Name) } context.Froms[v.Name] = value } } return context, nil } func (context *AmountContext) Get(name string) (interface{}, error) { for _, call := range context.Calls { if call == name { return nil, errors.New("circular reference: " + name) } } context.Calls = append(context.Calls, name) defer func() { context.Calls = context.Calls[:len(context.Calls)-1] }() if name == "面积" { return context.Site.Area, nil } if value, ok := context.Froms[name]; ok { return value, nil } for _, field := range context.Fields { if name == field.Name && field.Type == 2 { result, err := context.Exec(field.Value) if err != nil { return nil, err } value, _ := db.ToFloat64(result) context.Froms[name] = float64(math.Round(value*100) / 100) return value, nil } } return nil, errors.New("undeclared name: " + name) } func (context *AmountContext) Exec(expression string) (interface{}, error) { functions := map[string]govaluate.ExpressionFunction{} expr, err := govaluate.NewEvaluableExpressionWithFunctions(expression, functions) if err != nil { logger.Sugar.Infof("expr: %v error: %v", expression, err.Error()) return nil, err } result, err := expr.Eval(context) if err != nil { logger.Sugar.Infof("expr: %v error: %v", expression, err.Error()) return nil, err } return result, nil } func (context *AmountContext) Eval() (float64, float64, float64, float64, float64, float64, float64, float64, float64, error) { for _, field := range context.Fields { if _, ok := context.Froms[field.Name]; !ok && field.Type == 2 { result, err := context.Exec(field.Value) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) context.Froms[field.Name] = float64(math.Round(value*100) / 100) } } contractTotal := float64(0) if context.Pkg.ContractTotal != "" { result, err := context.Exec(context.Pkg.ContractTotal) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) contractTotal = float64(math.Round(value*100) / 100) } performance := float64(0) if context.Pkg.Performance != "" { result, err := context.Exec(context.Pkg.Performance) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) performance = float64(math.Round(value*100) / 100) } purchase := float64(0) if context.Pkg.Purchase != "" { result, err := context.Exec(context.Pkg.Purchase) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) purchase = float64(math.Round(value*100) / 100) } custom := float64(0) if context.Pkg.Custom != "" { result, err := context.Exec(context.Pkg.Custom) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) custom = float64(math.Round(value*100) / 100) } personalCollect := float64(0) if context.Pkg.PersonalCollect != "" { result, err := context.Exec(context.Pkg.PersonalCollect) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) personalCollect = float64(math.Round(value*100) / 100) } personalMaterial := float64(0) if context.Pkg.PersonalMaterial != "" { result, err := context.Exec(context.Pkg.PersonalMaterial) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) personalMaterial = float64(math.Round(value*100) / 100) } personalCustom := float64(0) if context.Pkg.PersonalCustom != "" { result, err := context.Exec(context.Pkg.PersonalCustom) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) personalCustom = float64(math.Round(value*100) / 100) } specialItem := float64(0) if context.Pkg.SpecialItem != "" { result, err := context.Exec(context.Pkg.SpecialItem) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) specialItem = float64(math.Round(value*100) / 100) } designFree := float64(0) if context.Pkg.DesignFree != "" { result, err := context.Exec(context.Pkg.DesignFree) if err != nil { return 0, 0, 0, 0, 0, 0, 0, 0, 0, err } value, _ := db.ToFloat64(result) designFree = float64(math.Round(value*100) / 100) } return contractTotal, performance, purchase, custom, personalCollect, personalMaterial, personalCustom, specialItem, designFree, nil } func (context *AmountContext) Save() string { return utils.JsonEncode(context.Froms) }