partner_company_contact.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package partner
  2. import (
  3. "bytes"
  4. "context"
  5. "database/sql"
  6. "fmt"
  7. "strings"
  8. dao "dashoo.cn/micro/app/dao/partner"
  9. model "dashoo.cn/micro/app/model/partner"
  10. "dashoo.cn/opms_libary/micro_srv"
  11. "dashoo.cn/opms_libary/myerrors"
  12. "dashoo.cn/opms_libary/request"
  13. "github.com/gogf/gf/database/gdb"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/os/gtime"
  16. "github.com/gogf/gf/util/gvalid"
  17. "github.com/xuri/excelize/v2"
  18. )
  19. type PartnerCompanyContactService struct {
  20. Dao *dao.PartnerCompanyContactDao
  21. ParterDao *dao.PartnerCompanyDao
  22. Tenant string
  23. userInfo request.UserInfo
  24. DataScope g.Map `json:"dataScope"`
  25. }
  26. func NewPartnerCompanyContactService(ctx context.Context) (*PartnerCompanyContactService, error) {
  27. tenant, err := micro_srv.GetTenant(ctx)
  28. if err != nil {
  29. err = myerrors.TipsError(fmt.Sprintf("获取租户码异常:%s", err.Error()))
  30. return nil, err
  31. }
  32. // 获取用户信息
  33. userInfo, err := micro_srv.GetUserInfo(ctx)
  34. if err != nil {
  35. return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
  36. }
  37. return &PartnerCompanyContactService{
  38. Dao: dao.NewPartnerCompanyContactDao(tenant),
  39. ParterDao: dao.NewPartnerCompanyDao(tenant),
  40. Tenant: tenant,
  41. userInfo: userInfo,
  42. DataScope: userInfo.DataScope,
  43. }, nil
  44. }
  45. func (s PartnerCompanyContactService) Get(ctx context.Context, id int) (*model.PartnerCompanyContact, error) {
  46. ent, err := s.Dao.Where("Id = ?", id).One()
  47. if err != nil {
  48. return nil, err
  49. }
  50. if ent == nil {
  51. return nil, myerrors.TipsError("合作伙伴不存在")
  52. }
  53. return ent, nil
  54. }
  55. func (s PartnerCompanyContactService) List(ctx context.Context, req *model.PartnerCompanyContactListReq) (int, []*model.PartnerCompanyContact, error) {
  56. dao := &s.Dao.PartnerCompanyContactDao
  57. if req.PartnerId != 0 {
  58. dao = dao.Where("partner_id = ?", req.PartnerId)
  59. }
  60. if req.Name != "" {
  61. likestr := fmt.Sprintf("%%%s%%", req.Name)
  62. dao = dao.Where("name like ?", likestr)
  63. }
  64. if req.Post != "" {
  65. dao = dao.Where("post = ?", req.Post)
  66. }
  67. total, err := dao.Count()
  68. if err != nil {
  69. return 0, nil, err
  70. }
  71. if req.PageNum != 0 {
  72. dao = dao.Page(req.GetPage())
  73. }
  74. orderby := "created_time desc"
  75. if req.OrderBy != "" {
  76. orderby = req.OrderBy
  77. }
  78. dao = dao.Order(orderby)
  79. ents := []*model.PartnerCompanyContact{}
  80. err = dao.Structs(&ents)
  81. if err != nil && err != sql.ErrNoRows {
  82. return 0, nil, err
  83. }
  84. return total, ents, err
  85. }
  86. func (s PartnerCompanyContactService) Add(ctx context.Context, req *model.PartnerCompanyContactAddReq) (int, error) {
  87. validErr := gvalid.CheckStruct(ctx, req, nil)
  88. if validErr != nil {
  89. return 0, myerrors.TipsError(validErr.Current().Error())
  90. }
  91. ent, err := s.ParterDao.Where("id = ?", req.PartnerId).One()
  92. if err != nil {
  93. return 0, err
  94. }
  95. if ent == nil {
  96. return 0, myerrors.TipsError(fmt.Sprintf("合作伙伴不存在: %d", req.PartnerId))
  97. }
  98. var id int
  99. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  100. var err error
  101. cid, err := tx.InsertAndGetId("partner_company_contact", model.PartnerCompanyContact{
  102. PartnerId: req.PartnerId,
  103. Name: req.Name,
  104. Post: req.Post,
  105. ContactWay: req.ContactWay,
  106. Territory: req.Territory,
  107. Remark: req.Remark,
  108. CreatedBy: int(s.userInfo.Id),
  109. CreatedName: s.userInfo.NickName,
  110. CreatedTime: gtime.Now(),
  111. UpdatedBy: int(s.userInfo.Id),
  112. UpdatedName: s.userInfo.NickName,
  113. UpdatedTime: gtime.Now(),
  114. })
  115. if err != nil {
  116. return err
  117. }
  118. id = int(cid)
  119. return nil
  120. })
  121. return id, txerr
  122. }
  123. func (s PartnerCompanyContactService) Update(ctx context.Context, req *model.PartnerCompanyContactUpdateReq) error {
  124. validErr := gvalid.CheckStruct(ctx, req, nil)
  125. if validErr != nil {
  126. return myerrors.TipsError(validErr.Current().Error())
  127. }
  128. ent, err := s.Dao.Where("id = ?", req.Id).One()
  129. if err != nil {
  130. return err
  131. }
  132. if ent == nil {
  133. return myerrors.TipsError(fmt.Sprintf("合作伙伴联系人不存在: %d", req.Id))
  134. }
  135. toupdate := map[string]interface{}{}
  136. if req.Name != "" {
  137. toupdate["name"] = req.Name
  138. }
  139. if req.Post != nil {
  140. toupdate["post"] = *req.Post
  141. }
  142. if req.ContactWay != nil {
  143. toupdate["contact_way"] = *req.ContactWay
  144. }
  145. if req.Territory != nil {
  146. toupdate["territory"] = *req.Territory
  147. }
  148. if req.Remark != nil {
  149. toupdate["remark"] = *req.Remark
  150. }
  151. if len(toupdate) != 0 {
  152. toupdate["updated_by"] = int(s.userInfo.Id)
  153. toupdate["updated_name"] = s.userInfo.NickName
  154. toupdate["updated_time"] = gtime.Now()
  155. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  156. _, err = tx.Update("partner_company_contact", toupdate, "id = ?", req.Id)
  157. if err != nil {
  158. return err
  159. }
  160. return nil
  161. })
  162. if txerr != nil {
  163. return txerr
  164. }
  165. }
  166. return nil
  167. }
  168. func (s PartnerCompanyContactService) ExcelUpload(ctx context.Context, req *model.PartnerCompanyContactExcelUploadReq) error {
  169. validErr := gvalid.CheckStruct(ctx, req, nil)
  170. if validErr != nil {
  171. return myerrors.TipsError(validErr.Current().Error())
  172. }
  173. ent, err := s.ParterDao.Where("id = ?", req.PartnerId).One()
  174. if err != nil {
  175. return err
  176. }
  177. if ent == nil {
  178. return myerrors.TipsError(fmt.Sprintf("合作伙伴不存在: %d", req.PartnerId))
  179. }
  180. b, err := DownFile(req.ExcelUrl)
  181. if err != nil {
  182. return myerrors.TipsError(fmt.Sprintf("下载 excel 异常 %s", err.Error()))
  183. }
  184. contact, err := s.ParseExcel(req.PartnerId, b)
  185. // err = ioutil.WriteFile("text.xlsx", b, 777)
  186. // fmt.Println(err)
  187. if err != nil {
  188. return myerrors.TipsError(fmt.Sprintf("解析 excel 异常 %s", err.Error()))
  189. }
  190. _, err = s.Dao.Insert(contact)
  191. return err
  192. }
  193. func (s PartnerCompanyContactService) ParseExcel(partnerId int, b []byte) ([]model.PartnerCompanyContact, error) {
  194. f, err := excelize.OpenReader(bytes.NewBuffer(b))
  195. if err != nil {
  196. return nil, err
  197. }
  198. sheet := "Sheet1"
  199. rows, err := f.GetRows(sheet)
  200. if err != nil {
  201. return nil, err
  202. }
  203. contact := []model.PartnerCompanyContact{}
  204. for rown, row := range rows[1:] {
  205. rown += 1
  206. if len(row) < 4 {
  207. return nil, fmt.Errorf("excel 格式错误:列数小于4列")
  208. }
  209. name := strings.TrimSpace(row[0])
  210. post := strings.TrimSpace(row[1])
  211. contactWay := strings.TrimSpace(row[2])
  212. territory := strings.TrimSpace(row[3])
  213. var remark string
  214. if len(row) > 4 {
  215. remark = strings.TrimSpace(row[4])
  216. }
  217. contact = append(contact, model.PartnerCompanyContact{
  218. PartnerId: partnerId,
  219. Name: name,
  220. Post: post,
  221. ContactWay: contactWay,
  222. Territory: territory,
  223. Remark: remark,
  224. CreatedBy: int(s.userInfo.Id),
  225. CreatedName: s.userInfo.NickName,
  226. CreatedTime: gtime.Now(),
  227. UpdatedBy: int(s.userInfo.Id),
  228. UpdatedName: s.userInfo.NickName,
  229. UpdatedTime: gtime.Now(),
  230. })
  231. }
  232. return contact, nil
  233. }
  234. func (s PartnerCompanyContactService) Delete(ctx context.Context, id []int) error {
  235. if len(id) == 0 {
  236. return nil
  237. }
  238. _, err := s.Dao.Where("Id IN (?)", id).Delete()
  239. return err
  240. }
  241. var contactExcelHeader = []ExcelHeader{
  242. {Name: "联系人", Width: 30},
  243. {Name: "岗位", Width: 30},
  244. {Name: "联系方式", Width: 30},
  245. {Name: "负责区域", Width: 30},
  246. {Name: "备注", Width: 40},
  247. }
  248. func ExcelTemplate() (*excelize.File, error) {
  249. tempData := [][]string{
  250. {"张三", "销售", "18000000000", "崂山", ""},
  251. }
  252. return NewExcel(contactExcelHeader, tempData)
  253. }