package service import ( "errors" "gas-cylinder-api/app/admin/model" "gas-cylinder-api/app/admin/service/dto" "gas-cylinder-api/common/actions" cDto "gas-cylinder-api/common/dto" "gas-cylinder-api/common/global" "gogs.baozhida.cn/zoie/OAuth-core/pkg/utils" "gogs.baozhida.cn/zoie/OAuth-core/service" "gorm.io/gorm" "strings" ) type Customer struct { service.Service } // GetPage 获取Customer列表 func (e *Customer) GetPage(c *dto.CustomerGetPageReq, list *[]model.Customer, count *int64, p *actions.DataPermission) error { var err error var data model.Customer err = e.Orm.Model(&data). Scopes( cDto.MakeCondition(c.GetNeedSearch()), cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), InDeptIdScopes(p.DeptId), ). Find(list).Limit(-1).Offset(-1). Count(count).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.GetFailedErr } return nil } // Get 获取Customer对象 func (e *Customer) Get(d *dto.CustomerGetReq, CustomerModel *model.Customer) error { err := e.Orm. Where("id = ?", d.GetId()). First(CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.GetNotFoundOrNoPermissionErr } return global.GetFailedErr } return nil } func (e *Customer) GetByPhone(d *dto.CustomerGetByPhoneReq, CustomerModel *model.Customer, p *actions.DataPermission) error { err := e.Orm. Scopes(actions.Permission(CustomerModel.TableName(), p)). Where("principal_phone = ? and dept_id = ?", d.Phone, p.DeptId). First(CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.GetNotFoundErr } return global.GetFailedErr } return nil } func (e *Customer) GetBorrowGasCylinder(d *dto.CustomerGetBorrowGasCylinderReq, list *[]model.CustomerGasCylinder) error { var err error var data model.CustomerGasCylinder err = e.Orm.Model(&data). Where("customer_id = ?", d.CustomerId). Find(list).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.GetFailedErr } return nil } // Insert 创建Customer对象 func (e *Customer) Insert(c *dto.CustomerInsertReq) error { var err error var data model.Customer tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() var id string for { var count int64 id = utils.GetUUID() var i int64 err = tx.Model(&data).Where("id = ?", id).Count(&count).Error if err != nil { continue } if i == 0 { break } } // 添加客户 c.Generate(&data) data.Id = id err = tx.Create(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.CreateFailedErr } // TODO 1.1.1.16新增客户信息 c.Id = data.Id return nil } func (e *Customer) InsertOrUpdate(c *dto.CustomerInsertReq, p *actions.DataPermission) error { var err error var data model.Customer tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() err = e.Orm. Scopes(actions.Permission(data.TableName(), p)). Where("principal_phone = ? and dept_id = ?", c.PrincipalPhone, p.DeptId). First(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { // TODO 1.1.1.16新增客户信息 // 添加客户 var id string for { var count int64 id = utils.GetUUID() var i int64 err = tx.Model(&data).Where("id = ?", id).Count(&count).Error if err != nil { continue } if i == 0 { break } } c.Generate(&data) data.Id = id err = tx.Create(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.CreateFailedErr } c.Id = data.Id return nil } return global.GetFailedErr } // 数据一致则不更新 if CustomerCheckDataConsistency(*c, data) { c.Id = data.Id return nil } dataIntegrity := CustomerCheckDataIntegrity(data) if dataIntegrity { data.IsSyncProv = true } // 更新客户信息 c.Generate(&data) err = tx.Save(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.UpdateFailedErr } c.Id = data.Id if dataIntegrity { // TODO 1.1.1.17更新客户信息 } return nil } // Update 修改Customer对象 func (e *Customer) Update(c *dto.CustomerUpdateReq, p *actions.DataPermission) error { var err error tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() var CustomerModel = model.Customer{} // 查询客户是否存在 err = tx.Scopes(InDeptIdScopes(p.DeptId)). Where("id = ?", c.GetId()). First(&CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.UpdateNotFoundOrNoPermissionErr } return global.UpdateFailedErr } if strings.Contains(c.Id, "_") { // 小程序下单用户 customer_id := strings.Split(c.Id, "_")[0] if len(c.AddressImg) > 0 { err = tx.Model(model.Address{}).Where("customer_id like ? and city = ? and area = ? and address = ?", customer_id+"%", c.City, c.Area, c.Address).Update("address_img", c.AddressImg).Error } } c.Generate(&CustomerModel) // 检查数据完整性 dataIntegrity := CustomerCheckDataIntegrity(CustomerModel) if dataIntegrity { CustomerModel.IsSyncProv = true } err = tx.Save(&CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.UpdateFailedErr } // 检查数据完整性 if dataIntegrity { // TODO 1.1.1.17更新客户信息 } c.Id = CustomerModel.Id return nil } // Remove 删除Customer func (e *Customer) Remove(c *dto.CustomerDeleteReq, p *actions.DataPermission) error { var err error tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() var CustomerModel model.Customer // 查询客户是否存在 err = e.Orm.Scopes(actions.Permission(CustomerModel.TableName(), p)). Where("id = ?", c.GetId()). First(&CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.DeleteNotFoundOrNoPermissionErr } return global.DeleteFailedErr } // TODO 1.1.1.18注销客户信息 db := tx.Delete(&CustomerModel) if err = db.Error; err != nil { e.Log.Errorf("db error: %s", err) return global.DeleteFailedErr } if db.RowsAffected == 0 { return global.DeleteNotFoundOrNoPermissionErr } return nil } // 检查数据完整性,数据完整之后再上传省平台 func CustomerCheckDataIntegrity(customer model.Customer) bool { flag := true if customer.Address == "" { flag = false } if customer.AddressImg == "" { flag = false } if customer.Lng == 0 { flag = false } if customer.Lat == 0 { flag = false } switch customer.Type { case 0: if customer.ShopName == "" { flag = false } case 1: if customer.PrincipalName == "" { flag = false } } if customer.City == "" { flag = false } if customer.Area == "" { flag = false } return flag } // 检查数据一致性,数据一致则不更新,不上传省平台 func CustomerCheckDataConsistency(req dto.CustomerInsertReq, customer model.Customer) bool { flag := true // 0-商户 1-私人 if customer.Type == 1 { if req.Name != customer.PrincipalName { flag = false } } if customer.Type == 0 { if req.Name != customer.ShopName { flag = false } } if req.PrincipalPhone != customer.PrincipalPhone { flag = false } if req.Address != customer.Address { flag = false } if req.Lng != customer.Lng { flag = false } if req.Lat != customer.Lat { flag = false } if req.Type != customer.Type { flag = false } if req.City != customer.City { flag = false } if req.Area != customer.Area { flag = false } if req.Remark != customer.Remark { flag = false } if req.StoreCode != customer.StoreCode { flag = false } return flag } // Update 修改Customer对象 func (e *Customer) AppletUpdate(c *dto.AppletCustomerUpdateReq) error { var err error tx := e.Orm.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() var CustomerModel = model.Customer{} // 查询客户是否存在 err = e.Orm.Where("id = ?", c.GetId()). First(&CustomerModel).Error if err != nil { e.Log.Errorf("db error: %s", err) if errors.Is(err, gorm.ErrRecordNotFound) { return global.UpdateNotFoundOrNoPermissionErr } return global.UpdateFailedErr } // 同步该手机用户在其他公司下的客户信息 customerList := make([]model.Customer, 0) // 查询客户是否存在 err = tx.Where("id like ?", c.Id+"%"). Find(&customerList).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.UpdateFailedErr } for _, customer := range customerList { customer.Name = c.Name customer.PrincipalPhone = c.PrincipalPhone customer.Type = c.Type if c.Type == 0 { customer.ShopName = c.Name } if c.Type == 1 { customer.PrincipalName = c.Name } // 检查数据完整性 dataIntegrity := CustomerCheckDataIntegrity(customer) if dataIntegrity { // TODO 同步省平台 更新客户信息 CustomerModel.IsSyncProv = true } err = tx.Save(&customer).Error if err != nil { e.Log.Errorf("db error: %s", err) return global.UpdateFailedErr } } c.Id = CustomerModel.Id return nil }