exportChargeService.go 11 KB

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