exportChargeService.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jyResourcesCenter/entity"
  4. "app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenter"
  5. "app.yhyue.com/moapp/jybase/common"
  6. "strings"
  7. "time"
  8. )
  9. // @Author jianghan
  10. // @Date 2025/2/7
  11. // @Description 查询可扣费方式
  12. func ChargeAccount(data *resourcesCenter.ChargeAccountReq) (resp *resourcesCenter.ChargeAccountResp) {
  13. now := time.Now().Format("2006-01-02")
  14. jyOrm := entity.JyEngine.NewSession()
  15. souceOrm := entity.Engine.NewSession()
  16. var exportPower int
  17. has, _ := jyOrm.Table("entniche_user").Cols("export_power").Where("id = ?", data.UserId).Get(&exportPower)
  18. if has && exportPower == 0 {
  19. return &resourcesCenter.ChargeAccountResp{Code: entity.ErrorCode, Message: "该人员没有数据定制导出权限"}
  20. }
  21. entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId})
  22. var entNums int64
  23. if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil {
  24. entNums = common.Int64All((*entInfo)["current"])
  25. } else {
  26. return &resourcesCenter.ChargeAccountResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"}
  27. }
  28. var personNums int64
  29. _ = souceOrm.Table("account_resources").Cols("SUM(number) AS totalNum").
  30. Where("accountId = ? and endTime >= ? and resourceType = ?", data.EntId, now, "高级字段包").Find(&personNums)
  31. if exportPower == 1 && (entNums > 0 || personNums == 0) {
  32. // 企业流量包扣除
  33. var personLimit *entity.PersonLimit
  34. _ = jyOrm.Table("entniche_export_limit").Select("*").
  35. Where("ent_id = ? and user_id = ?", data.EntId, data.UserId).Find(&personLimit)
  36. return &resourcesCenter.ChargeAccountResp{
  37. Code: entity.SuccessCode,
  38. Data: &resourcesCenter.SomeInfo{
  39. ChargeType: 0,
  40. Num1: entNums,
  41. Num2: personLimit.DataLimit,
  42. Num3: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.DataLimit-personLimit.ExportNums)),
  43. Num4: personLimit.MaxNums,
  44. Num5: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.MaxNums-personLimit.AllExportNums)),
  45. },
  46. }
  47. } else {
  48. // 个人高级字段包扣除
  49. return &resourcesCenter.ChargeAccountResp{
  50. Code: entity.SuccessCode,
  51. Data: &resourcesCenter.SomeInfo{
  52. ChargeType: 1,
  53. Num1: personNums,
  54. },
  55. }
  56. }
  57. }
  58. // @Author jianghan
  59. // @Date 2025/2/7
  60. // @Description
  61. //
  62. // 剑鱼定制导出企业流量包扣费,优先使用企业流量包扣费(个人账号有权限且企业下有可导出数量)
  63. // 个人流量包扣费只使用 高级流量包余额
  64. func ChargeFunc(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  65. if data.ChargeType == 0 {
  66. // 扣除企业数据包
  67. return entCharge(data)
  68. } else {
  69. // 扣除个人数据包
  70. return personCharge(data)
  71. }
  72. }
  73. func entCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  74. now := time.Now().Format("2006-01-02 15:04:05")
  75. souceOrm := entity.Engine.NewSession()
  76. jyOrm := entity.JyEngine.NewSession()
  77. var personLimit *entity.PersonLimit
  78. _ = jyOrm.Table("entniche_export_limit").Select("*").
  79. Where("ent_id = ? and user_id = ?", data.EntId, data.UserId).Find(&personLimit)
  80. var entNums int64
  81. entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId})
  82. if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil {
  83. entNums = common.Int64All((*entInfo)["current"])
  84. } else {
  85. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"}
  86. }
  87. if entNums < data.DeductNum {
  88. return &resourcesCenter.ChargeResp{
  89. Code: entity.SuccessCode,
  90. Message: "",
  91. Data: &resourcesCenter.SomeInfo{
  92. ChargeType: 0,
  93. ChargeResult: 0,
  94. FailMsg: "企业数据流量包余额不足",
  95. Num1: entNums,
  96. Num2: personLimit.DataLimit,
  97. Num3: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.DataLimit-personLimit.ExportNums)),
  98. Num4: personLimit.MaxNums,
  99. Num5: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.MaxNums-personLimit.AllExportNums)),
  100. },
  101. }
  102. }
  103. // 先更新mgo企业数据总量
  104. query := map[string]interface{}{
  105. "entid": data.EntId,
  106. "plan.current": map[string]interface{}{
  107. "$gte": data.DeductNum,
  108. },
  109. }
  110. update := map[string]interface{}{
  111. "$inc": map[string]interface{}{
  112. "plan.current": -data.DeductNum,
  113. },
  114. }
  115. b = entity.Mgo.Update("user", query, update, false, false)
  116. if !b {
  117. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  118. }
  119. err := jyOrm.Begin()
  120. //更新限额
  121. if err != nil {
  122. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  123. }
  124. var updateNum = int64(0)
  125. if personLimit.DataLimit == 0 && personLimit.MaxNums == 0 {
  126. // 当前账号没有限额
  127. updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ?", personLimit.Id).
  128. Incr("export_nums", data.ExportNum).
  129. Incr("all_export_nums", data.ExportNum).Update(nil)
  130. if err != nil || updateNum <= 0 {
  131. _ = jyOrm.Rollback()
  132. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  133. }
  134. } else {
  135. updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ? and data_limit >=", 0, data.DeductNum).
  136. Decr("data_limit", data.DeductNum).
  137. Decr("max_nums", data.DeductNum).
  138. Incr("export_nums", data.ExportNum).
  139. Incr("all_export_nums", data.ExportNum).
  140. Update(nil)
  141. if err != nil {
  142. _ = jyOrm.Rollback()
  143. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  144. }
  145. if updateNum <= 0 {
  146. _ = jyOrm.Rollback()
  147. _ = jyOrm.Table("entniche_export_limit").Select("*").
  148. Where("ent_id = ? and user_id = ?", data.EntId, data.UserId).Find(&personLimit)
  149. var msg []string
  150. if personLimit.DataLimit < data.DeductNum {
  151. msg = append(msg, "超出您的每日导出限额")
  152. }
  153. if personLimit.MaxNums < data.DeductNum {
  154. msg = append(msg, "超出您的数据导出总量限额")
  155. }
  156. return &resourcesCenter.ChargeResp{
  157. Code: entity.SuccessCode,
  158. Message: "",
  159. Data: &resourcesCenter.SomeInfo{
  160. ChargeType: 0,
  161. ChargeResult: 0,
  162. FailMsg: common.ObjToString(common.If(len(msg) > 0, strings.Join(msg, "、"), "")),
  163. Num1: entNums,
  164. Num2: personLimit.DataLimit,
  165. Num3: personLimit.DataLimit - personLimit.ExportNums,
  166. Num4: personLimit.MaxNums,
  167. Num5: personLimit.MaxNums - personLimit.AllExportNums,
  168. },
  169. }
  170. }
  171. }
  172. //保存导出日志
  173. var username, phone string
  174. _ = souceOrm.Table("entniche_user").Cols("name, phone").
  175. Where("id = ?", data.UserId).Find(&username, &phone)
  176. exportLog := &entity.ExportLog{
  177. UserName: username,
  178. ExportTime: now,
  179. DataSource: "3",
  180. ExportNum: data.ExportNum,
  181. DeductNum: data.ExportNum, //去重
  182. DownloadUrl: data.DownloadUrl,
  183. EntId: data.EntId,
  184. Phone: phone,
  185. UserId: data.UserId,
  186. Filter: data.Filter,
  187. }
  188. _, err = jyOrm.Table("entniche_export_log").Insert(&exportLog)
  189. if err != nil {
  190. _ = jyOrm.Rollback()
  191. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  192. }
  193. //保存账号使用明细
  194. detailed := entity.Detailed{
  195. AccountId: data.AccountId,
  196. CompanyId: data.EntId,
  197. ResourceType: "高级字段包",
  198. Number: data.DeductNum,
  199. Name: "数据流包",
  200. CreateTime: time.Now().Local(),
  201. Remarks: "",
  202. UserType: 0,
  203. UserId: data.PositionId,
  204. AccountType: 1,
  205. EntId: data.EntId,
  206. }
  207. _, err = souceOrm.Table(ConsumeRecord).Insert(&detailed)
  208. if err != nil {
  209. _ = jyOrm.Rollback()
  210. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  211. }
  212. err = jyOrm.Commit()
  213. if err != nil {
  214. _ = jyOrm.Rollback()
  215. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"}
  216. }
  217. return &resourcesCenter.ChargeResp{
  218. Code: entity.SuccessCode,
  219. Message: "",
  220. Data: &resourcesCenter.SomeInfo{
  221. ChargeType: 0,
  222. ChargeResult: 1,
  223. Num1: entNums,
  224. Num2: personLimit.DataLimit,
  225. Num3: personLimit.DataLimit - personLimit.ExportNums,
  226. Num4: personLimit.MaxNums,
  227. Num5: personLimit.MaxNums - personLimit.AllExportNums,
  228. },
  229. }
  230. }
  231. func personCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  232. return nil
  233. }