package final import ( "encoding/base64" "errors" "fmt" _ "image/gif" _ "image/jpeg" _ "image/png" "strconv" "strings" "zhiyuan/pkg/db" "github.com/gin-gonic/gin" "github.com/xuri/excelize/v2" ) type FinalSiteTable struct { ID int64 `json:"id" prop:"add:false"` TypeId int64 `json:"type_id" label:"类型" type:"int" prop:"add" search:"="` SiteId int64 `json:"site_id" label:"工地" type:"int" prop:"add" search:"="` CollectId int64 `json:"collect_id" label:"汇总ID" type:"int" prop:"add:false" search:"="` WorkerId int64 `json:"worker_id" label:"工人" type:"int" prop:"add:false" search:"="` Budget float64 `json:"budget" label:"预算" type:"float" prop:"add:false edit" default:"0"` Total float64 `json:"total" label:"金额" type:"float" prop:"add:false" default:"0"` Type int64 `json:"type" label:"类型" type:"int" default:"0" search:"="` State int64 `json:"state" label:"状态" type:"int" prop:"add:false" default:"0" search:"="` Tip int64 `json:"tip" label:"标记" type:"int" prop:"add:false edit" default:"0"` Owner int64 `json:"owner" label:"业主" type:"int" prop:"add:false" default:"0" search:"="` WorkerName string `json:"worker_name" label:"工人姓名" prop:"add:false select:if(zy_final_site_table.worker_id=0,manager.username,zy_final_site_table.worker_name)"` WorkerPhone string `json:"worker_phone" label:"工人电话" prop:"add:false select:if(zy_final_site_table.worker_id=0,manager.phone,zy_final_site_table.worker_phone)"` BankName string `json:"bank_name" label:"开户行" prop:"add:false select:if(zy_final_site_table.worker_id=0,manager.account_bank,zy_final_site_table.bank_name)"` BankCardNo string `json:"bank_card_no" label:"银行卡号" prop:"add:false select:if(zy_final_site_table.worker_id=0,manager.account_no,zy_final_site_table.bank_card_no)"` 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 (FinalSiteTable) TableName() string { return "zy_final_site_table" } func (model FinalSiteTable) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { return true } func (FinalSiteTable) OnePrivilege(c *gin.Context, id int64) bool { return true } func (FinalSiteTable) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error { type_id, _ := db.ToInt64(data["type_id"]) site_id, _ := db.ToInt64(data["site_id"]) typ, _ := db.ToInt64(data["type"]) datas := map[string]interface{}{ "type_id": type_id, "site_id": site_id, "deleted_at": 0, } control, _ := db.GetModelMap(db.Type(FinalSiteControlMobile{}), datas, nil) if control == nil || len(control) == 0 { data["budget"] = 0 return nil } var site FinalSite db.GetModel(map[string]interface{}{ "id": site_id, "deleted_at": 0, }, &site) if site.ID == 0 { return errors.New("工地不存在") } if site.StartTime >= 1711900800 { auxiliary_id, _ := db.ToInt64(control[0]["auxiliary_id"]) if auxiliary_id != 0 { var site FinalSite db.GetModel(map[string]interface{}{ "id": site_id, }, &site) if site.ID != 0 && site.AreaId == 1 { materials, _ := db.GetModelMap(db.Type(FinalMaterialMobile{}), map[string]interface{}{ "type_id": auxiliary_id, "site_id": site_id, "deleted_at": 0, }, nil) for _, material := range materials { type_id, _ := db.ToInt64(material["id"]) name := db.ToString(material["name"]) orders, _ := db.GetModelMap(db.Type(FinalMaterialOrder{}), map[string]interface{}{ "type_id": type_id, "site_id": site_id, "state !=": -1, "deleted_at": 0, }, nil) budget, _ := db.ToFloat64(material["budget"]) if budget != 0 && len(orders) == 0 { return errors.New(name + "未下单") } for _, order := range orders { state, _ := db.ToInt64(order["state"]) if state != 7 && state != 11 && state != 12 { return errors.New(name + "未完成") } } } } } } budget := float64(0) if typ == 1 { budget, _ = db.ToFloat64(control[0]["living_budget"]) } else { budget, _ = db.ToFloat64(control[0]["settle_budget"]) } data["budget"] = budget return nil } func (FinalSiteTable) AddAfter(c *gin.Context, id int64, post map[string]interface{}, data map[string]interface{}) { } func (FinalSiteTable) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error { return nil } func (FinalSiteTable) DelPrivilege(c *gin.Context, id int64) error { return nil } func (FinalSiteTable) Page() bool { return false } func (FinalSiteTable) Count() bool { return true } type JoinWorker struct { db.BaseModel } func (JoinWorker) TableName() string { return "zy_worker" } func (model FinalSiteTable) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{ { Model: FinalType{}, As: "finaltype", On: []string{"`finaltype`.`id` = " + model.TableName() + ".`type_id`"}, }, { Model: JoinWorker{}, As: "worker", On: []string{"`worker`.`id` = " + model.TableName() + ".`worker_id`"}, }, { Model: FinalSite{}, As: "finalsite", On: []string{"`finalsite`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: JoinAdmin{}, As: "manager", On: []string{"`manager`.`id` = `finalsite`.`manager_id`"}, }} } type FinalSiteTableMobile struct { FinalSiteTable Username string `json:"username" label:"业主姓名" prop:"select:finalsite.username" search:"like"` Phone string `json:"phone" label:"手机号码" prop:"select:finalsite.phone" search:"like"` Village string `json:"village" label:"小区名称" prop:"select:finalsite.village" search:"like"` Address string `json:"address" label:"房屋地址" prop:"select:finalsite.address" search:"like"` RoomNo string `json:"room_no" label:"楼栋房号" prop:"select:finalsite.room_no" search:"like"` Area string `json:"area" label:"面积" prop:"select:finalsite.area"` ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="` ShopName int64 `json:"shop_name" label:"门店" prop:"select:shop.shop_name"` Name string `json:"name" label:"类别名称" prop:"select:finaltype.name"` WorkTypeId int64 `json:"work_type_id" label:"工种" prop:"select:finaltype.work_type_id"` WorkTypeIds string `json:"work_type_ids" label:"工种" prop:"select:finaltype.work_type_ids"` IsRemark int64 `json:"isremark" prop:"select:finaltype.remark"` WorkTypeName string `json:"work_type_name" label:"工种名称" prop:"select:worktype.name"` WorkIdcode string `json:"work_idcode" label:"工人身份证号码"` Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"` Remark string `json:"remark" label:"备注" prop:"select:finalsiteitem.remark"` ControlBudget float64 `json:"control_budget" label:"控额" prop:"select:control.budget"` } func (model FinalSiteTableMobile) GroupBy() string { return fmt.Sprintf("`%s`.`id`", model.TableName()) } type JoinWorkType struct { db.BaseModel } func (JoinWorkType) TableName() string { return "zy_work_type" } type JoinFinalSiteItem struct { db.BaseModel } func (JoinFinalSiteItem) TableName() string { return "(select `zy_final_site_item`.`table_id`, ROUND(sum(`zy_final_site_item`.price*`zy_final_site_item`.num)) as `total`, GROUP_CONCAT(`zy_final_site_item`.remark) as `remark` from `zy_final_site_item` where `zy_final_site_item`.`deleted_at` = 0 group by `zy_final_site_item`.`table_id`)" } func (FinalSiteTableMobile) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error { type_id, _ := db.ToInt64(data["type_id"]) site_id, _ := db.ToInt64(data["site_id"]) typ, _ := db.ToInt64(data["type"]) datas := map[string]interface{}{ "type_id": type_id, "site_id": site_id, "deleted_at": 0, } control, _ := db.GetModelMap(db.Type(FinalSiteControlMobile{}), datas, nil) if control == nil || len(control) == 0 { return errors.New("没有权限") } var site FinalSite db.GetModel(map[string]interface{}{ "id": site_id, "deleted_at": 0, }, &site) if site.ID == 0 { return errors.New("工地不存在") } if site.StartTime >= 1711900800 { auxiliary_id, _ := db.ToInt64(control[0]["auxiliary_id"]) if auxiliary_id != 0 { var site FinalSite db.GetModel(map[string]interface{}{ "id": site_id, }, &site) if site.ID != 0 && site.AreaId == 1 { materials, _ := db.GetModelMap(db.Type(FinalMaterialMobile{}), map[string]interface{}{ "type_id": auxiliary_id, "site_id": site_id, "deleted_at": 0, }, nil) for _, material := range materials { type_id, _ := db.ToInt64(material["id"]) name := db.ToString(material["name"]) orders, _ := db.GetModelMap(db.Type(FinalMaterialOrder{}), map[string]interface{}{ "type_id": type_id, "site_id": site_id, "state !=": -1, "deleted_at": 0, }, nil) budget, _ := db.ToFloat64(material["budget"]) if budget != 0 && len(orders) == 0 { return errors.New(name + "未下单") } for _, order := range orders { state, _ := db.ToInt64(order["state"]) if state != 7 && state != 11 && state != 12 { return errors.New(name + "未完成") } } } } } } state := int64(0) budget := float64(0) if typ == 1 { state, _ = db.ToInt64(control[0]["living_state"]) budget, _ = db.ToFloat64(control[0]["living_budget"]) } else { state, _ = db.ToInt64(control[0]["settle_state"]) budget, _ = db.ToFloat64(control[0]["settle_budget"]) } data["budget"] = budget if state != 1 { return errors.New("没有权限") } return nil } func (model FinalSiteTableMobile) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return append(model.FinalSiteTable.LeftJoin(data, s), db.JoinModel{ Model: JoinWorkType{}, As: "worktype", On: []string{"`worktype`.`id` = `finaltype`.`work_type_id`"}, }, db.JoinModel{ Model: JoinFinalSiteItem{}, As: "finalsiteitem", On: []string{"`finalsiteitem`.`table_id` = " + model.TableName() + ".`id`"}, }, db.JoinModel{ Model: JoinShop{}, As: "shop", On: []string{"`shop`.`id` = `finalsite`.`shop_id`"}, }, db.JoinModel{ Model: FinalSiteControl{}, As: "control", On: []string{"`control`.`type_id` = " + model.TableName() + ".`type_id` and `control`.`site_id` = " + model.TableName() + ".`site_id` and `control`.`deleted_at` = 0"}, }) } func (FinalSiteTableMobile) Export(model db.Model, data []map[string]interface{}, file *excelize.File) [][]string { rows := make([][]string, 0) states := []string{"未提交", "工程队长审核", "财务审核", "店长审核", "财务付款", "已完成"} header := []string{"ID", "门店", "工地", "类型", "工人姓名", "开户行", "银行卡号", "金额", "身份证号码", "备注", "状态", "项目经理", "工程队长审核", "财务审核", "店长审核", "财务付款"} rows = append(rows, header) for _, v := range data { worksite := /*db.ToString(v["address"]) + " " +*/ db.ToString(v["village"]) + "" + db.ToString(v["room_no"]) if worksite == "" { worksite = db.ToString(v["address"]) } /*if db.ToString(v["area"]) != "" { worksite += " " + db.ToString(v["area"]) }*/ name := db.ToString(v["name"]) typ, _ := db.ToInt64(v["type"]) if typ == 1 { name += " 费用" } else { name += " 结算" } worker := db.ToString(v["worker_name"]) //if worker_id, ok := db.ToInt64(v["worker_id"]); ok && worker_id != 0 { //worker = db.ToString(v["worker_name"]) /*+ " " + db.ToString(v["worker_phone"])*/ //} state := int64(0) if t, ok := db.ToInt64(v["state"]); ok { state = t } stateName := "" if state >= 0 && int(state) < len(states) { stateName = states[state] } row := []string{ db.ToString(v["id"]), db.ToString(v["shop_name"]), worksite, name, worker, db.ToString(v["bank_name"]), db.ToString(v["bank_card_no"]), db.ToString(v["total"]), db.ToString(v["work_idcode"]), db.ToString(v["remark"]), stateName, } rows = append(rows, row) } return rows } func (FinalSiteTableMobile) ExportAfter(data []map[string]interface{}, file *excelize.File) { ids := []interface{}{} collects := []interface{}{} for _, v := range data { ids = append(ids, v["id"]) collects = append(collects, v["collect_id"]) } tableMap := map[string]map[string]string{} collectMap := map[string]map[string]string{} ps, err := db.GetModelMap(db.Type(FinalSiteProcess{}), map[string]interface{}{ "table_id in": ids, }, nil) if err != nil { return } for _, v := range ps { if _, ok := tableMap[db.ToString(v["table_id"])]; !ok { tableMap[db.ToString(v["table_id"])] = map[string]string{} } tableMap[db.ToString(v["table_id"])][db.ToString(v["type"])] = db.ToString(v["signature"]) } ps, err = db.GetModelMap(db.Type(FinalSiteProcess{}), map[string]interface{}{ "collect_id in": collects, }, nil) if err != nil { return } for _, v := range ps { if _, ok := collectMap[db.ToString(v["collect_id"])]; !ok { collectMap[db.ToString(v["collect_id"])] = map[string]string{} } collectMap[db.ToString(v["collect_id"])][db.ToString(v["type"])] = db.ToString(v["signature"]) } for i, v := range data { file.SetRowHeight("Sheet1", i+2, 40) if table, ok := tableMap[db.ToString(v["id"])]; ok { if signature, ok := table[db.ToString(0)]; ok && signature != "" { signature = strings.Replace(signature, "data:image/png;base64,", "", 1) de, err := base64.StdEncoding.DecodeString(signature) if err == nil { file.AddPictureFromBytes("Sheet1", "L"+strconv.Itoa(i+2), &excelize.Picture{ Extension: ".png", File: de, Format: &excelize.GraphicOptions{AutoFit: true}, }) } } if signature, ok := table[db.ToString(1)]; ok && signature != "" { signature = strings.Replace(signature, "data:image/png;base64,", "", 1) de, err := base64.StdEncoding.DecodeString(signature) if err == nil { file.AddPictureFromBytes("Sheet1", "M"+strconv.Itoa(i+2), &excelize.Picture{ Extension: ".png", File: de, Format: &excelize.GraphicOptions{AutoFit: true}, }) } } } if collect, ok := collectMap[db.ToString(v["collect_id"])]; ok { if signature, ok := collect[db.ToString(2)]; ok && signature != "" { signature = strings.Replace(signature, "data:image/png;base64,", "", 1) de, err := base64.StdEncoding.DecodeString(signature) if err == nil { file.AddPictureFromBytes("Sheet1", "N"+strconv.Itoa(i+2), &excelize.Picture{ Extension: ".png", File: de, Format: &excelize.GraphicOptions{AutoFit: true}, }) } } if signature, ok := collect[db.ToString(3)]; ok && signature != "" { signature = strings.Replace(signature, "data:image/png;base64,", "", 1) de, err := base64.StdEncoding.DecodeString(signature) if err == nil { file.AddPictureFromBytes("Sheet1", "O"+strconv.Itoa(i+2), &excelize.Picture{ Extension: ".png", File: de, Format: &excelize.GraphicOptions{AutoFit: true}, }) } } if signature, ok := collect[db.ToString(4)]; ok && signature != "" { signature = strings.Replace(signature, "data:image/png;base64,", "", 1) de, err := base64.StdEncoding.DecodeString(signature) if err == nil { file.AddPictureFromBytes("Sheet1", "P"+strconv.Itoa(i+2), &excelize.Picture{ Extension: ".png", File: de, Format: &excelize.GraphicOptions{AutoFit: true}, }) } } } } } type FinalSiteTableCollect struct { ManagerName string `json:"manager_name" prop:"select:manager.username"` ManagerPhone string `json:"manager_phone" prop:"select:manager.phone"` ProjectLeaderName string `json:"projectleader_name" prop:"select:projectleader.username"` ProjectLeaderPhone string `json:"projectleader_phone" prop:"select:projectleader.phone"` FinalSiteTableMobile } func (model FinalSiteTableCollect) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if shopId, _ := db.ToInt64(data["shop_id"]); shopId == 0 { s.Where = append(s.Where, "(1!=1)") } return true } func (FinalSiteTableCollect) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error { return nil } func (FinalSiteTableCollect) DelPrivilege(c *gin.Context, id int64) error { return errors.New("没有权限") } func (model FinalSiteTableCollect) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return append(model.FinalSiteTableMobile.LeftJoin(data, s), db.JoinModel{ Model: JoinAdmin{}, As: "projectleader", On: []string{"`projectleader`.`id` = `finalsite`.`project_leader_id`"}, }, ) }