package final import ( "errors" "fmt" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" _ "image/gif" _ "image/jpeg" _ "image/png" "strings" "time" "zhiyuan/pkg/db" "zhiyuan/pkg/logger" "zhiyuan/pkg/utils" "zhiyuan/pkg/weixin/mp" "zhiyuan/services/admin" "github.com/gin-gonic/gin" ) type FinalMaterialOrder struct { ID int64 `json:"id" prop:"add:false"` OrderNo string `json:"order_no" label:"订单号" type:"string" prop:"add:false" search:"like"` SiteId int64 `json:"site_id" label:"工地" type:"int" prop:"add:false" search:"="` Type int64 `json:"type" label:"类型" type:"int" prop:"add:false" search:"="` IsCustom int64 `json:"is_custom" label:"是否定制" type:"int" prop:"add:false" search:"="` TypeId int64 `json:"type_id" label:"类型ID" type:"int" prop:"add:false" search:"="` SupplierId int64 `json:"supplier_id" label:"材料商ID" type:"int" prop:"add:false" search:"="` Total float64 `json:"total" label:"金额" type:"float" prop:"add:false" default:"0"` ReceiptDate int64 `json:"receipt_date" label:"配送日期" type:"int" prop:"add:false" default:"0"` InstallDate int64 `json:"install_date" label:"安装日期" type:"int" prop:"add:false" default:"0"` State int64 `json:"state" label:"状态" type:"int" prop:"add:false" default:"0" search:"="` ProcessId int64 `json:"process_id" label:"待完成审核流程" type:"int" prop:"add:false" default:"0" search:"="` SettleId int64 `json:"settle_id" label:"结算流程" type:"int" prop:"add:false" default:"0" search:"="` TakeTime int64 `json:"take_time" label:"下单时间" type:"int" prop:"add:false" default:"0" search:"="` StockTime int64 `json:"stock_time" label:"备货时间" type:"int" prop:"add:false" default:"0" search:"="` NoticeTime int64 `json:"notice_time" label:"通知配送时间" type:"int" prop:"add:false" default:"0" search:"="` DeliverTime int64 `json:"deliver_time" label:"送达时间" type:"int" prop:"add:false" default:"0" search:"="` AcceptTime int64 `json:"accept_time" label:"收货时间" type:"int" prop:"add:false" default:"0" search:"="` InstallTime int64 `json:"install_time" label:"安装时间" type:"int" prop:"add:false" default:"0" search:"="` OverTime int64 `json:"over_time" label:"完成时间" type:"int" prop:"add:false" default:"0" search:"="` NoticeMeasureTime int64 `json:"notice_measure_time" label:"通知测量时间" type:"int" prop:"add:false" default:"0" search:"="` MeasureTime int64 `json:"measure_time" label:"测量时间" type:"int" prop:"add:false" default:"0" search:"="` ReportTimeout int64 `json:"report_timeout" label:"报备超时计数" type:"int" prop:"add:false" default:"0" search:"="` Attachment string `json:"attachment" label:"附件" type:"string" prop:"add:false"` CreatedId int64 `json:"created_id" type:"int" prop:"add:false"` 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 (FinalMaterialOrder) TableName() string { return "zy_final_material_order" } func (model FinalMaterialOrder) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { return true } func (FinalMaterialOrder) OnePrivilege(c *gin.Context, id int64) bool { return true } func (FinalMaterialOrder) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error { return errors.New("没有权限") } func (FinalMaterialOrder) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error { return errors.New("没有权限") } func (FinalMaterialOrder) DelPrivilege(c *gin.Context, id int64) error { return errors.New("没有权限") } func (FinalMaterialOrder) Page() bool { return false } func (FinalMaterialOrder) Count() bool { return true } type FinalMaterialOrderMobile struct { Supplier string `json:"supplier" label:"材料商" prop:"select:supplier.name" search:"like"` SupplierName string `json:"supplier_name" type:"string" prop:"select:supplier.name" search:"like"` SupplierAdminId int64 `json:"supplier_admin_id" type:"int" prop:"select:supplier.adminId"` Install int64 `json:"install" label:"安装" type:"int" prop:"select:supplier.install"` ReceiptHour int64 `json:"receipt_hour" type:"int" prop:"select:supplier.receipt_hour"` InstallHour int64 `json:"install_hour" type:"int" prop:"select:supplier.install_hour"` StockHour int64 `json:"stock_hour" label:"备货小时" type:"int" prop:"select:if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)"` 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 float64 `json:"area" label:"面积" type:"float" 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"` CollectInfo string `json:"collect_info" label:"门店" prop:"select:shop.collect_info"` PkgId int64 `json:"pkg_id" label:"套餐" type:"int" prop:"select:finalsite.pkg_id" search:"="` TypeId int64 `json:"type_id" label:"开工类型" type:"int" prop:"select:finalsite.type_id" search:"="` ManagerId int64 `json:"manager_id" label:"项目经理" type:"int" prop:"select:finalsite.manager_id" search:"="` ProjectLeaderId int64 `json:"project_leader_id" label:"工程队长" type:"int" prop:"select:finalsite.project_leader_id" search:"="` DesignerId int64 `json:"designer_id" label:"设计师" type:"int" prop:"select:finalsite.designer_id" search:"="` Names string `json:"names" label:"名称" type:"string" prop:"add:false select:concat(finalsite.village,finalsite.address,finalsite.room_no)" search:"like"` StartTime int64 `json:"starttime" label:"开工日期" type:"int" prop:"select:finalsite.starttime"` ProcessType int64 `json:"process_type" type:"int" prop:"select:process.type" search:"="` ManagerName string `json:"manager_name" type:"string" prop:"select:manager.username"` ManagerPhone string `json:"manager_phone" type:"string" prop:"select:manager.phone"` ManagerHeadImgUrl string `json:"manager_headimgurl" type:"string" prop:"select:manager.headimgurl"` DesignerName string `json:"designer_name" type:"string" prop:"select:designer.username"` DesignerPhone string `json:"designer_phone" type:"string" prop:"select:designer.phone"` DesignerHeadImgUrl string `json:"designer_headimgurl" type:"string" prop:"select:designer.headimgurl"` ProjectLeaderName string `json:"project_leader_name" type:"string" prop:"select:project_leader.username"` ProjectLeaderPhone string `json:"project_leader_phone" type:"string" prop:"select:project_leader.phone"` ProjectLeaderHeadImgUrl string `json:"project_leader_headimgurl" type:"string" prop:"select:project_leader.headimgurl"` SettleState int64 `json:"settle_state" label:"结算状态" type:"int" prop:"select:settle.state" search:"="` SettleCreatedAt int64 `json:"settle_created_at" type:"int" prop:"select:settle.created_at"` PkgName int64 `json:"pkg_name" label:"套餐" prop:"select:finalpkg.name"` MeasureTimeout int64 `json:"measure_timeout" label:"量尺超时" prop:"select:if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0)" search:"="` StockTimeout int64 `json:"stock_timeout" label:"备货超时" prop:"select:if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600zy_final_material_order.receipt_date,1,0)" search:"="` InstallTimeout int64 `json:"install_timeout" label:"安装超时" prop:"select:if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0)" search:"="` FinalMaterialOrder } func (model FinalMaterialOrderMobile) GroupBy() string { return fmt.Sprintf("`%s`.`id`", model.TableName()) } func (model FinalMaterialOrderMobile) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if search, ok := data["search"]; ok { search = s.Param(fmt.Sprintf("%%%s%%", search)) s.Where = append(s.Where, fmt.Sprintf("`%s`.`order_no` LIKE %s OR `finalsite`.`username` LIKE %s OR `finalsite`.`phone` LIKE %s OR `finalsite`.`village` LIKE %s OR `finalsite`.`address` LIKE %s OR `manager`.`username` LIKE %s OR `manager`.`phone` LIKE %s OR `supplier`.`name` LIKE %s OR concat(`finalsite`.`village`,`finalsite`.`address`,`finalsite`.`room_no`) LIKE %s", model.TableName(), search, search, search, search, search, search, search, search, search)) } if settle, ok := data["settle"]; ok { if settleId, ok := db.ToInt64(settle); ok { var settle FinalMaterialSettle db.GetModel(map[string]interface{}{ "id": settleId, "deleted_at": 0, }, &settle) if settle.ID != 0 { ids := strings.Split(settle.Orders, ",") s.Where = append(s.Where, fmt.Sprintf("`%s`.`id` in %s", model.TableName(), s.Param(ids))) } } } if _, ok := data["process"]; ok { s.Where = append(s.Where, fmt.Sprintf("`%s`.`process_id` != %s", model.TableName(), s.Param(0))) adminID := c.GetInt("adminID") adminIDs := s.Param(adminID) where := fmt.Sprintf("(`finalsite`.`manager_id` = %s AND `process`.`type` = 6 AND `process`.`check_at2` = 0) OR (`supplier`.`adminId` = %s AND `process`.`type` = 6 AND `process`.`check_at3` = 0) OR (`%s`.`created_id` = %s AND `process`.`type` = 7 AND `process`.`check_at2` = 0)", adminIDs, adminIDs, model.TableName(), adminIDs) if admin.CheckAuth([]string{"final:verify:audit"}, adminID) { where += " OR (`process`.`type` = 7 AND `process`.`check_at` = 0) OR (`process`.`type` = 12 AND `process`.`check_at` = 0)" } s.Where = append(s.Where, "("+where+")") } if _, ok := data["dcl"]; ok { adminID := c.GetInt("adminID") adminIDs := s.Param(adminID) dclWhere := fmt.Sprintf("(`finalsite`.`manager_id` = %s AND ((`%s`.`state` in (8,1,3,4,6) AND `%s`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at2` = 0) OR (`process`.`type` = 14 AND `process`.`check_at` = 0)))", adminIDs, model.TableName(), model.TableName()) dclWhere += fmt.Sprintf(" OR (`supplier`.`adminId` = %s AND ((`%s`.`state` in (9,0,2,5,11) AND `%s`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at3` = 0)))", adminIDs, model.TableName(), model.TableName()) dclWhere += fmt.Sprintf(" OR (`finalsite`.`project_leader_id` = %s AND `%s`.`state` = 7 AND `%s`.`process_id` = 0)", adminIDs, model.TableName(), model.TableName()) dclWhere += fmt.Sprintf(" OR (`%s`.`created_id` = %s AND `process`.`type` = 7 AND `process`.`check_at2` = 0)", model.TableName(), adminIDs) if admin.CheckAuth([]string{"final:verify:audit"}, adminID) { dclWhere += " OR (`process`.`type` = 7 AND `process`.`check_at` = 0) OR (`process`.`type` = 12 AND `process`.`check_at` = 0)" } s.Where = append(s.Where, fmt.Sprintf("(%s)", dclWhere)) } if starttime1s, ok := data["starttime1"]; ok { if starttime1, ok := db.ToInt64(starttime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`finalsite`.`starttime` >= %s", s.Param(starttime1))) } } if starttime2s, ok := data["starttime2"]; ok { if starttime2, ok := db.ToInt64(starttime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`finalsite`.`starttime` < %s", s.Param(starttime2+60*60*24))) } } if taketime1s, ok := data["taketime1"]; ok { if taketime1, ok := db.ToInt64(taketime1s); ok { s.Where = append(s.Where, fmt.Sprintf("`%s`.`take_time` >= %s", model.TableName(), s.Param(taketime1))) } } if taketime2s, ok := data["taketime2"]; ok { if taketime2, ok := db.ToInt64(taketime2s); ok { s.Where = append(s.Where, fmt.Sprintf("`%s`.`take_time` < %s", model.TableName(), s.Param(taketime2+60*60*24))) } } if state, _ := db.ToInt64(data["state"]); state != -1 { s.Where = append(s.Where, fmt.Sprintf("`%s`.`state` != %s", model.TableName(), s.Param(-1))) } if timeout, ok := db.ToInt64(data["timeout"]); ok { switch timeout { case 0: s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 0 AND if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600zy_final_material_order.receipt_date,1,0) = 0 AND if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 0)") case 1: s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 1 OR if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600zy_final_material_order.receipt_date,1,0) = 1 OR if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 1)") case 2: s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 1)") case 3: s.Where = append(s.Where, "(if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600zy_final_material_order.receipt_date,1,0) = 1)") case 5: s.Where = append(s.Where, "(if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 1)") case 6: s.Where = append(s.Where, "(zy_final_material_order.report_timeout>0)") } } return model.FinalMaterialOrder.ListPrivilege(c, data, s) } func (model FinalMaterialOrderMobile) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return append(model.FinalMaterialOrder.LeftJoin(data, s), db.JoinModel{ Model: FinalSite{}, As: "finalsite", On: []string{"`finalsite`.`id` = " + model.TableName() + ".`site_id`"}, }, db.JoinModel{ Model: FinalSupplier{}, As: "supplier", On: []string{"`supplier`.`id` = " + model.TableName() + ".`supplier_id`"}, }, db.JoinModel{ Model: JoinShop{}, As: "shop", On: []string{"`shop`.`id` = `finalsite`.`shop_id`"}, }, db.JoinModel{ Model: FinalMaterialOrderProcess{}, As: "process", On: []string{"`process`.`id` = " + model.TableName() + ".`process_id`"}, }, db.JoinModel{ Model: FinalMaterialSettle{}, As: "settle", On: []string{"`settle`.`id` = " + model.TableName() + ".`settle_id`"}, }, db.JoinModel{ Model: JoinAdmin{}, As: "manager", On: []string{"`manager`.`id` = `finalsite`.`manager_id`"}, }, db.JoinModel{ Model: JoinAdmin{}, As: "designer", On: []string{"`designer`.`id` = `finalsite`.`designer_id`"}, }, db.JoinModel{ Model: JoinAdmin{}, As: "project_leader", On: []string{"`project_leader`.`id` = `finalsite`.`project_leader_id`"}, }, db.JoinModel{ Model: FinalPkg{}, As: "finalpkg", On: []string{"`finalpkg`.`id` = `finalsite`.`pkg_id`"}, }) } func (model FinalMaterialOrderMobile) ListAfter(c *gin.Context, data map[string]interface{}, list []map[string]interface{}) []map[string]interface{} { ids := make([]int64, 0) idmap := make(map[int64]int) for i, v := range list { id, _ := db.ToInt64(v["id"]) ids = append(ids, id) idmap[id] = i } if len(ids) == 0 { return list } datas, _ := db.GetModelMap(db.Type(FinalMaterialOrderItemMobile{}), map[string]interface{}{ fmt.Sprintf("`%s`.`order_id` in", FinalMaterialOrderItemMobile{}.TableName()): ids, fmt.Sprintf("`%s`.`deleted_at`", FinalMaterialOrderItemMobile{}.TableName()): 0, }, nil) for _, v := range datas { id, _ := db.ToInt64(v["order_id"]) if n, ok := idmap[id]; ok { items := make([]map[string]interface{}, 0) if is, ok := list[n]["items"].([]map[string]interface{}); ok { items = is } items = append(items, v) list[n]["items"] = items } } return list } func (model FinalMaterialOrderMobile) ExportSpan() []string { return []string{"items"} } func (model FinalMaterialOrderMobile) ExportFields() []db.ExportField { return []db.ExportField{ { Label: "ID", Name: "id", }, { Label: "订单号", Name: "order_no", Width: 30, }, { Label: "门店", Name: "shop_name", Width: 20, }, { Label: "工地", Name: "address", Width: 30, }, { Label: "套餐", Name: "pkg_name", Width: 10, }, { Label: "开工日期", Name: "starttime", Width: 15, }, { Label: "业主", Name: "username", Width: 25, }, { Label: "设计师", Name: "designer_name", Width: 25, }, { Label: "项目经理", Name: "manager_name", Width: 25, }, { Label: "工程队长", Name: "project_leader_name", Width: 25, }, { Label: "材料商", Name: "supplier", Width: 15, }, { Label: "材料名称", Name: "items.mat_name", Width: 50, }, { Label: "单价", Name: "items.price", }, { Label: "数量", Name: "items.num", }, { Label: "总价", Name: "items.total", }, { Label: "备注", Name: "items.remark", }, { Label: "金额", Name: "total", }, { Label: "下单时间", Name: "take_time", Width: 20, }, { Label: "备货时间", Name: "stock_time", Width: 20, }, { Label: "通知配送时间", Name: "notice_time", Width: 20, }, { Label: "送达时间", Name: "deliver_time", Width: 20, }, { Label: "完成时间", Name: "over_time", Width: 20, }, { Label: "状态", Name: "state", }, { Label: "结算状态", Name: "settle_state", }, { Label: "超时状态", Name: "timeout_state", }, } } func (FinalMaterialOrderMobile) ExportValue(row map[string]interface{}, rowIndex int, field db.ExportField, data []map[string]interface{}) string { states := []string{"已取消", "待备货", "已备货", "待配送", "待收货", "已收货", "待安装", "待验收", "已完成", "已下单", "待测量", "待审核", "待结算", "已结算"} switch field.Name { case "address": worksite := db.ToString(row["address"]) + " " + db.ToString(row["village"]) + "" + db.ToString(row["room_no"]) area, _ := db.ToFloat64(row["area"]) if area != 0 { worksite += " " + db.ToString(area) + "㎡" } return worksite case "starttime": starttime, _ := db.ToInt64(row["starttime"]) if starttime == 0 { return "" } t := time.Unix(starttime, 0).Local() return t.Format("2006-01-02") case "username": return db.ToString(row["username"]) + " " + db.ToString(row["phone"]) case "designer_name": return db.ToString(row["designer_name"]) + " " + db.ToString(row["designer_phone"]) case "manager_name": return db.ToString(row["manager_name"]) + " " + db.ToString(row["manager_phone"]) case "project_leader_name": return db.ToString(row["project_leader_name"]) + " " + db.ToString(row["project_leader_phone"]) case "items.num": return db.ToString(row["items.num"]) + " " + db.ToString(row["items.unit"]) case "take_time": take_time, _ := db.ToInt64(row["take_time"]) if take_time == 0 { return "" } t := time.Unix(take_time, 0).Local() return t.Format("2006-01-02 15:04") case "stock_time": stock_time, _ := db.ToInt64(row["stock_time"]) if stock_time == 0 { return "" } t := time.Unix(stock_time, 0).Local() return t.Format("2006-01-02 15:04") case "notice_time": notice_time, _ := db.ToInt64(row["notice_time"]) if notice_time == 0 { return "" } t := time.Unix(notice_time, 0).Local() return t.Format("2006-01-02 15:04") case "deliver_time": deliver_time, _ := db.ToInt64(row["deliver_time"]) if deliver_time == 0 { return "" } t := time.Unix(deliver_time, 0).Local() return t.Format("2006-01-02 15:04") case "over_time": over_time, _ := db.ToInt64(row["over_time"]) if over_time == 0 { return "" } t := time.Unix(over_time, 0).Local() return t.Format("2006-01-02 15:04") case "state": if state, ok := db.ToInt64(row["state"]); ok { return states[state+1] } return "" case "settle_state": sstates := []string{"已驳回", "", "", "待财务审核", "待店长审核", "待财务付款", "已完成"} if settle_state, ok := db.ToInt64(row["settle_state"]); ok { return sstates[settle_state+1] } return "" case "timeout_state": measure_timeout, _ := db.ToInt64(row["measure_timeout"]) stock_timeout, _ := db.ToInt64(row["stock_timeout"]) receipt_timeout, _ := db.ToInt64(row["receipt_timeout"]) install_timeout, _ := db.ToInt64(row["install_timeout"]) report_timeout, _ := db.ToInt64(row["report_timeout"]) states := []string{} if report_timeout > 0 { states = append(states, "报备超时"+db.ToString(report_timeout)+"次") } if measure_timeout == 1 { states = append(states, "量尺超时") } if stock_timeout == 1 { states = append(states, "备货超时") } if receipt_timeout == 1 { states = append(states, "配送超时") } if install_timeout == 1 { states = append(states, "安装超时") } return strings.Join(states, ",") } return db.ToString(row[field.Name]) } type FinalMaterialOrderSupplier struct { FinalMaterialOrderMobile } func (model FinalMaterialOrderSupplier) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { if !admin.IsSuperAdmin(c.GetInt("adminID")) { adminID := s.Param(c.GetInt("adminID")) where := fmt.Sprintf("`supplier`.`adminId` = %s OR `%s`.`created_id` = %s OR `finalsite`.`manager_id` = %s OR `finalsite`.`project_leader_id` = %s OR `finalsite`.`created_id` = %s", adminID, model.TableName(), adminID, adminID, adminID, adminID) if admin.CheckAuth([]string{"final:verify"}, c.GetInt("adminID")) { if admin.CheckAuth([]string{"final:verify:manager"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:finance"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:customer"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:assistant"}, c.GetInt("adminID")) { info, _ := admin.GetInfoByID(c.GetInt("adminID"), nil, nil) if info == nil { return false } where = where + fmt.Sprintf(" OR FIND_IN_SET(`finalsite`.`shop_id`, %s)", s.Param(info.ShopIds)) } if admin.CheckAuth([]string{"final:verify:audit"}, c.GetInt("adminID")) { where = fmt.Sprintf("%s OR `manager`.`audit_id` = %s OR `manager`.`audit_id` = %s OR ISNULL(`manager`.`audit_id`)", where, s.Param(c.GetInt("adminID")), s.Param(0)) } } s.Where = append(s.Where, fmt.Sprintf("(%s)", where)) } return model.FinalMaterialOrderMobile.ListPrivilege(c, data, s) } func (FinalMaterialOrderSupplier) Count() bool { return true } func SendMaterialMessage(adminID int, orderNo string, orderId int64, address string, text string) error { logger.Sugar.Infof("SendMaterialMessage, send: %v %v %v %v %v", adminID, orderNo, orderId, 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 orderId != 0 { url = "https://jz.nczyzs.com/final/#/order/" + db.ToString(orderId) } ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{ "character_string1": map[string]interface{}{ "value": utils.SubStr(orderNo, 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 } type FinalMaterialOrderRemindModel struct { ID int64 `json:"id" prop:"add:false"` OrderNo string `json:"order_no" label:"订单号" type:"string"` SupplierId int64 `json:"supplier_id" label:"材料商ID" type:"int"` ReceiptDate int64 `json:"receipt_date" label:"配送日期" type:"int"` StockHour int64 `json:"stock_hour" label:"备货小时" type:"int" prop:"select:if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)"` SupplierAdminId int64 `json:"supplier_admin_id" type:"int" prop:"select:supplier.adminId"` Village string `json:"village" label:"小区名称" prop:"select:finalsite.village"` Address string `json:"address" label:"房屋地址" prop:"select:finalsite.address"` RoomNo string `json:"room_no" label:"楼栋房号" prop:"select:finalsite.room_no"` ManagerId int64 `json:"manager_id" label:"项目经理" prop:"select:finalsite.manager_id"` FinalMaterialOrderMobile } func FinalMaterialOrderRemind() { t := time.Now().Unix() orders := make([]FinalMaterialOrderRemindModel, 0) s := db.ModelQuery(db.Type(&orders), map[string]interface{}{}, true) db.WhereParse(&s, map[string]interface{}{ "state": 2, "process_id": 0, "deleted_at": 0, }) s.Where = append(s.Where, fmt.Sprintf("(`%s`.`type` = 0 and `%s`.`receipt_date` < %s) or (`%s`.`type` = 1 and `%s`.`receipt_date` < %s)", FinalMaterialOrderRemindModel{}.TableName(), FinalMaterialOrderRemindModel{}.TableName(), s.Param(t+2*3600), FinalMaterialOrderRemindModel{}.TableName(), FinalMaterialOrderRemindModel{}.TableName(), s.Param(t+6*3600))) query, params := s.Query() db.Query(query, params, &orders, FinalMaterialOrderRemindModel{}.DB()) for _, order := range orders { address := order.Address if order.Village != " " { address += " " + order.Village } if order.RoomNo != " " { address += " " + order.RoomNo } msg := "您的待配送订单即将超时,请及时配送" if t >= order.ReceiptDate { msg = "您的待配送订单已超时,请及时配送" } SendMaterialMessage(int(order.SupplierAdminId), order.OrderNo, order.ID, address, msg) } } // 超时提醒 func FinalSiteWorkCheckExtensionAndSenWxMsg() { var matPickWork []MatPickWork db.GetModel(map[string]interface{}{ "deleted_at": 0, "example_at <": gtime.Now().Format("Y-m-d"), "item_status IN ": []int{0, 4}, //节点状态:0:未确认 1:已完成 2超时完成 3 超时未完成 4:验收未通过' }, &matPickWork) for _, work := range matPickWork { //修改成超时未完成 err := db.UpdateModel(db.Type(MatPickWork{}), work.ID, map[string]interface{}{ "item_status": 3, //超时未完成 }) if err != nil { continue } msg := fmt.Sprintf("工地:%s | 项目:%s 工作已超时,请及时处理,", work.Village, work.PickName) var toUser int if work.WorkerId != 0 { toUser = gconv.Int(work.WorkerId) SendSiteWorkMessage(toUser, work.SiteId, msg) } } fmt.Println("End final.FinalSiteWorkCheckExtensionAndSenWxMsg...") } // 快超时提醒 提前2天 func FinalSiteWorkCheckAboutToExtensionAndSenWxMsg() { var matPickWork []MatPickWork db.GetModel(map[string]interface{}{ "example_at > ": gtime.Now().Format("Y-m-d"), "example_at <= ": gtime.Now().AddDate(0, 0, 2).Format("Y-m-d"), "deleted_at": 0, "item_status IN ": []int{0, 4}, //节点状态:0:未确认 1:已完成 2超时完成 3 超时未完成 4:验收未通过' }, &matPickWork) fmt.Println(len(matPickWork)) for _, work := range matPickWork { msg := fmt.Sprintf("工地:%s | 项目:%s 工作即将超时,请及时处理,", work.Village, work.PickName) var toUser int if work.WorkerId != 0 { toUser = gconv.Int(work.WorkerId) SendSiteWorkMessage(toUser, work.SiteId, msg) } } fmt.Println("End final.FinalSiteWorkCheckAboutToExtensionAndSenWxMsg...") } type FinalMaterialOrderExport struct { SettleId int64 `json:"settle_id" label:"结算流程" type:"int" prop:"add:false" default:"0" search:"="` Total float64 `json:"total" label:"金额" type:"float" prop:"add:false select:sum(zy_final_material_order.total)" default:"0"` 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"` AccountName string `json:"account_name" prop:"select:account.account_name"` AccountBank string `json:"account_bank" prop:"select:account.account_bank"` AccountNo string `json:"account_no" prop:"select:account.account_no"` db.BaseModel } func (FinalMaterialOrderExport) TableName() string { return "zy_final_material_order" } func (model FinalMaterialOrderExport) GroupBy() string { return fmt.Sprintf("`%s`.`id`", model.TableName()) } func (model FinalMaterialOrderExport) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool { return true } func (model FinalMaterialOrderExport) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel { return []db.JoinModel{{ Model: FinalSite{}, As: "finalsite", On: []string{"`finalsite`.`id` = " + model.TableName() + ".`site_id`"}, }, { Model: FinalMaterialSettle{}, As: "settle", On: []string{"`settle`.`id` = " + model.TableName() + ".`settle_id`"}, }, { Model: FinalSupplierAccount{}, As: "account", On: []string{"`account`.`id` = `settle`.`account_id`"}, }} } func (model FinalMaterialOrderExport) ExportFields() []db.ExportField { return []db.ExportField{ { Label: "项目名称", Name: "address", Width: 30, }, { Label: "金额", Name: "total", Width: 20, }, { Label: "支付对象", Name: "account_name", Width: 30, }, { Label: "开户行", Name: "account_bank", Width: 20, }, { Label: "账号", Name: "account_no", Width: 30, }, } } func (FinalMaterialOrderExport) ExportValue(row map[string]interface{}, rowIndex int, field db.ExportField, data []map[string]interface{}) string { switch field.Name { case "address": worksite := db.ToString(row["address"]) + " " + db.ToString(row["village"]) + "" + db.ToString(row["room_no"]) return worksite } return db.ToString(row[field.Name]) }