package final import ( "errors" "fmt" "math" "zhiyuan/pkg/db" "zhiyuan/pkg/logger" "zhiyuan/pkg/utils" "zhiyuan/pkg/weixin/mp" "zhiyuan/services/admin" "github.com/gin-gonic/gin" ) type FinalSettleProcess struct { ID int64 `json:"id" prop:"add:false"` SettleId int64 `json:"settle_id" label:"结算ID" type:"int"` CollectId int64 `json:"collect_id" label:"汇总" type:"int"` Explain string `json:"explain" label:"说明" type:"string" search:"like"` Pictures string `json:"pictures" label:"图片" type:"string" search:"like"` Type int64 `json:"type" label:"类型" type:"int" prop:"add" default:"0"` Signature string `json:"signature" label:"签名" prop:"add" type:"string"` Total float64 `json:"total" label:"金额" type:"float" default:"0"` State int64 `json:"state" label:"状态" type:"int" prop:"add" default:"0"` CreatedId int64 `json:"created_id" label:"创建人员" type:"int" prop:"add:false" search:"="` CreatedName string `json:"created_name" prop:"add:false select:created.username"` CreatedPhone string `json:"created_phone" prop:"add:false select:created.phone"` CreatedHeadimgurl string `json:"created_headimgurl" prop:"add:false select:created.headimgurl"` 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 (FinalSettleProcess) TableName() string { return "zy_final_settle_process" } func (model FinalSettleProcess) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { settle_id, _ := db.ToInt64(data["settle_id"]) collect_id, _ := db.ToInt64(data["collect_id"]) if settle_id != 0 && collect_id != 0 { s.Where = append(s.Where, fmt.Sprintf("`%s`.`settle_id` = %s OR `%s`.`collect_id` = %s", model.TableName(), s.Param(settle_id), model.TableName(), s.Param(collect_id))) } else if settle_id != 0 { s.Where = append(s.Where, fmt.Sprintf("`%s`.`settle_id` = %s", model.TableName(), s.Param(settle_id))) } else if collect_id != 0 { s.Where = append(s.Where, fmt.Sprintf("`%s`.`collect_id` = %s", model.TableName(), s.Param(collect_id))) } return true } func (FinalSettleProcess) OnePrivilege(c *gin.Context, id int64) bool { return true } func SendSettleMessage(adminID int, settleId int64, address string, text string) error { logger.Sugar.Infof("SendSettleMessage, send: %v %v %v %v", adminID, settleId, address, text) client, err := mp.NewClient(1) if err != nil { return err } adminInfo, err := admin.GetInfoByID(adminID, nil, nil) if err != nil { return err } if adminInfo == nil || adminInfo.OpenId == "" { return nil } url := "" if settleId != 0 { url = "https://jz.nczyzs.com/final/#/settle/" + db.ToString(settleId) } ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{ "character_string1": map[string]interface{}{ "value": utils.SubStr(db.ToString(settleId), 0, 32), }, "thing2": map[string]interface{}{ "value": utils.SubStr(address, 0, 20), }, "thing5": map[string]interface{}{ "value": utils.SubStr(text, 0, 20), }, }) logger.Sugar.Infof("SendMaterialMessage, ret: %v %v", ret, err) return err } func (FinalSettleProcess) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error { data["created_id"] = c.GetInt("adminID") typ, _ := db.ToInt64(data["type"]) siteID, _ := db.ToInt64(post["site_id"]) settleID, _ := db.ToInt64(data["settle_id"]) collectID, _ := db.ToInt64(data["collect_id"]) state, _ := db.ToInt64(data["state"]) total, _ := db.ToFloat64(data["total"]) pictures := db.ToString(post["pictures"]) if siteID != 0 { if pictures == "" { return errors.New("请上传业主签字的竣工结算单") } var model FinalSite db.GetModel(map[string]interface{}{ "id": siteID, }, &model) totals := float64(0) managerPrice := float64(0) prices := make([]FinalManagerPrice, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &prices) if len(prices) == 0 { return errors.New("未录承包额") } for _, v := range prices { managerPrice += v.Price } /*changePrice := float64(0) changes := make([]FinalSiteChange, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &changes) for _, v := range changes { if v.Type == 1 { if v.Type2 == 1 { changePrice += v.Amount } else if v.Type2 == 2 { changePrice -= v.Amount } } }*/ workerPrice := float64(0) type FinalSiteTableCollects struct { ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="` Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"` State int64 `json:"state" label:"状态" type:"int"` Deduct int64 `json:"deduct" type:"int" prop:"select:finaltype.deduct"` FinalSiteTableCollect } models := make([]FinalSiteTableCollects, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &models) //if len(models) == 0 { // return errors.New("没有权限") //} for _, v := range models { if v.State == -1 { continue } if v.State < 3 { return errors.New("工人结算未完成") } if v.Deduct == 0 { workerPrice += v.Total } } auxiliaryPrice := float64(0) type FinalMaterialCollects struct { Budget float64 `json:"budget" label:"预算" type:"float" prop:"edit" default:"0"` State int64 `json:"state" label:"状态" type:"int"` FinalMaterialMobile } materials := make([]FinalMaterialCollects, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &materials) //if len(materials) == 0 { // return errors.New("没有权限") //} for _, v := range materials { if v.Budget != 0 && v.State != 1 { return errors.New("辅材未下单") } } orders := make([]FinalMaterialOrder, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &orders) for _, v := range orders { if v.State == -1 { continue } if v.State != 7 && v.State != 11 && v.State != 12 { return errors.New("材料订单未完成") } if v.Type == 0 { auxiliaryPrice += v.Total } } //managerPrice = managerPrice + changePrice*0.9*0.65 totals = math.Round(managerPrice - workerPrice - auxiliaryPrice) settleid, err := db.InsertModel(db.Type(FinalSettle{}), map[string]interface{}{ "site_id": siteID, "manager_id": model.ManagerId, "total": totals, "manager_price": managerPrice, "worker_price": workerPrice, "auxiliary_price": auxiliaryPrice, "state": 1, }) if err == nil { data["settle_id"] = settleid } else { return errors.New("没有权限") } } else if settleID != 0 { var model FinalSettle db.GetModel(map[string]interface{}{ "id": settleID, }, &model) if model.ID == 0 || model.State != typ { return errors.New("没有权限") } s := model.State + 1 if s > 4 { return errors.New("没有权限") } data = map[string]interface{}{ "state": s, } if state == 0 { if typ == 0 { if pictures == "" { return errors.New("请上传业主签字的竣工结算单") } totals := float64(0) managerPrice := float64(0) prices := make([]FinalManagerPrice, 0) db.GetModel(map[string]interface{}{ "site_id": model.SiteId, "deleted_at": 0, }, &prices) if len(prices) == 0 { return errors.New("未录承包额") } for _, v := range prices { managerPrice += v.Price } /*changePrice := float64(0) changes := make([]FinalSiteChange, 0) db.GetModel(map[string]interface{}{ "site_id": siteID, "deleted_at": 0, }, &changes) for _, v := range changes { if v.Type == 1 { if v.Type2 == 1 { changePrice += v.Amount } else if v.Type2 == 2 { changePrice -= v.Amount } } }*/ workerPrice := float64(0) type FinalSiteTableCollects struct { ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="` Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"` State int64 `json:"state" label:"状态" type:"int"` Deduct int64 `json:"deduct" type:"int" prop:"select:finaltype.deduct"` FinalSiteTableCollect } models := make([]FinalSiteTableCollects, 0) db.GetModel(map[string]interface{}{ "site_id": model.SiteId, "deleted_at": 0, }, &models) //if len(models) == 0 { // return errors.New("没有权限") //} for _, v := range models { if v.State == -1 { continue } if v.State != 5 { return errors.New("工人结算未完成") } if v.Deduct == 0 { workerPrice += v.Total } } auxiliaryPrice := float64(0) type FinalMaterialCollects struct { Budget float64 `json:"budget" label:"预算" type:"float" prop:"edit" default:"0"` State int64 `json:"state" label:"状态" type:"int"` FinalMaterialMobile } materials := make([]FinalMaterialCollects, 0) db.GetModel(map[string]interface{}{ "site_id": model.SiteId, "deleted_at": 0, }, &materials) //if len(materials) == 0 { // return errors.New("没有权限") //} for _, v := range materials { if v.Budget != 0 && v.State != 1 { return errors.New("辅材未下单") } } orders := make([]FinalMaterialOrder, 0) db.GetModel(map[string]interface{}{ "site_id": model.SiteId, "deleted_at": 0, }, &orders) for _, v := range orders { if v.State == -1 { continue } if v.State != 7 && v.State != 11 && v.State != 12 { return errors.New("材料订单未完成") } if v.Type == 0 { auxiliaryPrice += v.Total } } //managerPrice = managerPrice + changePrice*0.9*0.65 totals = math.Round(managerPrice - workerPrice - auxiliaryPrice) data["total"] = totals data["manager_price"] = managerPrice data["worker_price"] = workerPrice data["auxiliary_price"] = auxiliaryPrice } if typ == 1 { data["subsidy_price"] = total data["total"] = math.Round(model.ManagerPrice - model.WorkerPrice - model.AuxiliaryPrice + total) } } else { data["state"] = 0 } err := db.UpdateModel(db.Type(model), settleID, data) if err != nil { return errors.New("没有权限") } } else if collectID != 0 { var model FinalSiteCollect db.GetModel(map[string]interface{}{ "id": collectID, }, &model) if model.ID == 0 || model.State+1 != typ { return errors.New("没有权限") } if state != 0 { return errors.New("没有权限") } s := model.State + 1 err := db.UpdateModel(db.Type(model), collectID, map[string]interface{}{ "state": s, }) if err != nil { return errors.New("没有权限") } err = db.UpdateModels(db.Type(FinalSettle{}), map[string]interface{}{ "collect_id": collectID, }, map[string]interface{}{ "state": s + 1, }) if err != nil { return errors.New("没有权限") } } else { return errors.New("没有权限") } return nil } func (FinalSettleProcess) AddAfter(c *gin.Context, id int64, post map[string]interface{}, data map[string]interface{}) { var process FinalSettleProcess db.GetModel(map[string]interface{}{ "id": id, "deleted_at": 0, }, &process) if process.Type == 0 || process.Type == 1 { var model FinalSettle db.GetModel(map[string]interface{}{ "id": process.SettleId, }, &model) if model.ID != 0 { var site FinalSite db.GetModel(map[string]interface{}{ "id": model.SiteId, "deleted_at": 0, }, &site) address := site.Address if site.Village != " " { address += " " + site.Village } if site.RoomNo != " " { address += " " + site.RoomNo } if process.Type == 0 { SendSettleMessage(599, model.ID, address, "项目经理已申请结算,请操作回访") //SendSettleMessage(54, model.ID, address, "项目经理已申请结算,请操作回访") SendSettleMessage(1557, model.ID, address, "项目经理已申请结算,请操作回访") } else if process.Type == 1 { if process.State == 0 { SendSettleMessage(int(site.ManagerId), model.ID, address, "请确认结算金额") } else { SendSettleMessage(int(site.ManagerId), model.ID, address, "已驳回,请重新提交") } } } } } func (FinalSettleProcess) Page() bool { return false } func (model FinalSettleProcess) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: JoinAdmin{}, As: "created", On: []string{"`created`.`id` = " + model.TableName() + ".`created_id`"}, }, } }