exportChargeService.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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.ChargeResp) {
  13. now := time.Now().Format("2006-01-02")
  14. jyOrm := entity.JyEngine.NewSession()
  15. centerOrm := entity.Engine.NewSession()
  16. var exportPower int
  17. _, err := jyOrm.Table("entniche_user").Cols("export_power").Where("id = ?", data.EntUserId).Get(&exportPower)
  18. if err != nil {
  19. return &resourcesCenter.ChargeResp{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. plan := (*entInfo)["plan"].(map[string]interface{})
  25. entNums = common.Int64All(plan["current"])
  26. } else {
  27. return &resourcesCenter.ChargeResp{Code: entity.SuccessCode, Message: "未查询到企业数据流量"}
  28. }
  29. var personNums int64
  30. _, err = centerOrm.Table("account_resources").Select("sum(number) as number").
  31. Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums)
  32. if err != nil {
  33. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人流量包查询失败"}
  34. }
  35. if exportPower == 1 && (entNums > 0 || personNums == 0) {
  36. // 企业流量包扣除
  37. var personLimit []*entity.PersonLimit
  38. err = jyOrm.Table("entniche_export_limit").Select("*").
  39. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  40. if err != nil || personLimit == nil || len(personLimit) == 0 {
  41. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"}
  42. }
  43. return &resourcesCenter.ChargeResp{
  44. Code: entity.SuccessCode,
  45. Data: &resourcesCenter.SomeInfo{
  46. ChargeType: 0,
  47. Num1: entNums,
  48. Num2: personLimit[0].DataLimit,
  49. Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)),
  50. Num4: personLimit[0].MaxNums,
  51. Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)),
  52. },
  53. }
  54. } else {
  55. // 个人高级字段包扣除
  56. return &resourcesCenter.ChargeResp{
  57. Code: entity.SuccessCode,
  58. Data: &resourcesCenter.SomeInfo{
  59. ChargeType: 1,
  60. Num1: personNums,
  61. },
  62. }
  63. }
  64. }
  65. // @Author jianghan
  66. // @Date 2025/2/7
  67. // @Description
  68. //
  69. // 剑鱼定制导出企业流量包扣费,优先使用企业流量包扣费(个人账号有权限且企业下有可导出数量)
  70. // 个人流量包扣费只使用 高级流量包余额
  71. func ChargeFunc(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  72. if data.ChargeType == 0 {
  73. // 扣除企业数据包
  74. return entCharge(data)
  75. } else {
  76. // 扣除个人数据包
  77. return personCharge(data)
  78. }
  79. }
  80. func entCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  81. souceOrm := entity.Engine.NewSession()
  82. jyOrm := entity.JyEngine.NewSession()
  83. var personLimit []*entity.PersonLimit
  84. err := jyOrm.Table("entniche_export_limit").Select("*").
  85. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  86. if err != nil || personLimit == nil || len(personLimit) == 0 {
  87. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"}
  88. }
  89. var entNums int64
  90. entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId})
  91. if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil {
  92. plan := (*entInfo)["plan"].(map[string]interface{})
  93. entNums = common.Int64All(plan["current"])
  94. } else {
  95. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"}
  96. }
  97. if entNums < data.DeductNum {
  98. return &resourcesCenter.ChargeResp{
  99. Code: entity.SuccessCode,
  100. Message: "",
  101. Data: &resourcesCenter.SomeInfo{
  102. ChargeType: 0,
  103. ChargeResult: 0,
  104. FailMsg: "企业数据流量包余额不足",
  105. Num1: entNums,
  106. Num2: personLimit[0].DataLimit,
  107. Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)),
  108. Num4: personLimit[0].MaxNums,
  109. Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)),
  110. },
  111. }
  112. }
  113. // 先更新mgo企业数据总量
  114. query := map[string]interface{}{
  115. "entid": data.EntId,
  116. "plan.current": map[string]interface{}{
  117. "$gte": data.DeductNum,
  118. },
  119. }
  120. update := map[string]interface{}{
  121. "$inc": map[string]interface{}{
  122. "plan.current": -data.DeductNum,
  123. },
  124. }
  125. b = entity.Mgo.Update("user", query, update, false, false)
  126. if !b {
  127. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业余额操作失败"}
  128. }
  129. err = jyOrm.Begin()
  130. //更新限额
  131. if err != nil {
  132. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  133. }
  134. var updateNum = int64(0)
  135. if personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0 {
  136. // 当前账号没有限额
  137. updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ?", personLimit[0].Id).
  138. Incr("export_nums", data.ExportNum).
  139. Incr("all_export_nums", data.ExportNum).Update(&entity.PersonLimit{})
  140. if err != nil || updateNum <= 0 {
  141. _ = jyOrm.Rollback()
  142. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  143. }
  144. } else {
  145. updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ? and data_limit >= ?", personLimit[0].Id, data.DeductNum).
  146. Decr("data_limit", data.DeductNum).
  147. Decr("max_nums", data.DeductNum).
  148. Incr("export_nums", data.ExportNum).
  149. Incr("all_export_nums", data.ExportNum).
  150. Update(&entity.PersonLimit{})
  151. if err != nil {
  152. _ = jyOrm.Rollback()
  153. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  154. }
  155. if updateNum <= 0 {
  156. _ = jyOrm.Rollback()
  157. _ = jyOrm.Table("entniche_export_limit").Select("*").
  158. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  159. var msg []string
  160. if personLimit[0].DataLimit < data.DeductNum {
  161. msg = append(msg, "超出您的每日导出限额")
  162. }
  163. if personLimit[0].MaxNums < data.DeductNum {
  164. msg = append(msg, "超出您的数据导出总量限额")
  165. }
  166. return &resourcesCenter.ChargeResp{
  167. Code: entity.SuccessCode,
  168. Message: "",
  169. Data: &resourcesCenter.SomeInfo{
  170. ChargeType: 0,
  171. ChargeResult: 0,
  172. FailMsg: common.ObjToString(common.If(len(msg) > 0, strings.Join(msg, "、"), "")),
  173. Num1: entNums,
  174. Num2: personLimit[0].DataLimit,
  175. Num3: personLimit[0].DataLimit - personLimit[0].ExportNums,
  176. Num4: personLimit[0].MaxNums,
  177. Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums,
  178. },
  179. }
  180. }
  181. }
  182. //保存账号使用明细
  183. detailed := entity.Detailed{
  184. AccountId: data.UserId,
  185. CompanyId: data.EntId,
  186. ResourceType: "高级字段包",
  187. Number: data.ExportNum,
  188. DeductionNumb: data.DeductNum,
  189. Name: "数据流包",
  190. CreateTime: time.Now().Local(),
  191. Remarks: data.Remark,
  192. UserType: 0,
  193. UserId: data.UserId,
  194. AccountType: 1,
  195. EntId: data.EntId,
  196. }
  197. updateNum, err = souceOrm.Table(ConsumeRecord).Insert(&detailed)
  198. if err != nil || updateNum <= 0 {
  199. _ = jyOrm.Rollback()
  200. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"}
  201. }
  202. err = jyOrm.Commit()
  203. if err != nil {
  204. _ = jyOrm.Rollback()
  205. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"}
  206. }
  207. return &resourcesCenter.ChargeResp{
  208. Code: entity.SuccessCode,
  209. Message: "",
  210. Data: &resourcesCenter.SomeInfo{
  211. ChargeType: 0,
  212. ChargeResult: 1,
  213. Num1: entNums,
  214. Num2: personLimit[0].DataLimit,
  215. Num3: personLimit[0].DataLimit - personLimit[0].ExportNums,
  216. Num4: personLimit[0].MaxNums,
  217. Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums,
  218. },
  219. }
  220. }
  221. func personCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  222. now := time.Now().Format("2006-01-02")
  223. jyOrm := entity.Engine.NewSession()
  224. centerOrm := entity.Engine.NewSession()
  225. var personNums int64
  226. _, err := centerOrm.Table("account_resources").Select("sum(number) as number").
  227. Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums)
  228. if err != nil {
  229. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人余额查询失败"}
  230. }
  231. if personNums == 0 || personNums < data.DeductNum {
  232. return &resourcesCenter.ChargeResp{
  233. Code: entity.SuccessCode,
  234. Data: &resourcesCenter.SomeInfo{
  235. ChargeType: 1,
  236. ChargeResult: 0,
  237. Num1: personNums,
  238. },
  239. }
  240. }
  241. var updateNum int64
  242. err = centerOrm.Begin()
  243. if err != nil {
  244. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  245. }
  246. //修改个人账户资源
  247. balanceList := []entity.Balance{}
  248. err = centerOrm.Table(AccountResources).
  249. Select("*").
  250. Where("accountId= ? and number > 0 and resourceType= ? and endTime >= ?", data.UserId, "高级字段包", now).
  251. OrderBy("endTime").
  252. Find(&balanceList)
  253. if err != nil {
  254. _ = centerOrm.Rollback()
  255. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人账号资源查询失败"}
  256. }
  257. for _, value := range balanceList {
  258. if value.Number > data.DeductNum {
  259. value.Number = value.Number - data.DeductNum
  260. data.DeductNum = 0
  261. } else {
  262. data.DeductNum = data.DeductNum - value.Number
  263. value.Number = 0
  264. }
  265. updateNum, err = centerOrm.Table(AccountResources).
  266. Cols("number").ID(value.Id).
  267. Update(&value)
  268. if err != nil || updateNum <= 0 {
  269. _ = centerOrm.Rollback()
  270. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "修改账户失败"}
  271. }
  272. if data.DeductNum == 0 {
  273. break
  274. }
  275. }
  276. //保存账号使用明细
  277. detailed := entity.Detailed{
  278. AccountId: data.UserId,
  279. CompanyId: data.EntId,
  280. ResourceType: "高级字段包",
  281. Number: data.ExportNum,
  282. DeductionNumb: data.DeductNum,
  283. Name: "数据流包",
  284. CreateTime: time.Now().Local(),
  285. Remarks: data.Remark,
  286. UserType: 0,
  287. UserId: data.UserId,
  288. AccountType: 1,
  289. EntId: data.EntId,
  290. }
  291. updateNum, err = centerOrm.Table(ConsumeRecord).Insert(&detailed)
  292. if err != nil || updateNum <= 0 {
  293. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"}
  294. }
  295. err = centerOrm.Commit()
  296. if err != nil {
  297. _ = jyOrm.Rollback()
  298. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"}
  299. }
  300. return &resourcesCenter.ChargeResp{
  301. Code: entity.SuccessCode,
  302. Message: "",
  303. Data: &resourcesCenter.SomeInfo{
  304. ChargeType: 1,
  305. ChargeResult: 1,
  306. Num1: personNums,
  307. },
  308. }
  309. }