exportChargeService.go 12 KB

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